商汤科技2018校招X86/ARM代码优化工程师笔试第一场

时长:120分钟 总分:100分

129浏览 0人已完成答题

题型介绍
题型 单选题 判断题 简答题
数量 5 5 3
1.
尝试对下面这段矩阵乘法代码使用向量化技术进行优化。 void gemm...
问题详情

尝试对下面这段矩阵乘法代码使用向量化技术进行优化。
void gemm(int M, int N, int K, const float* a, const float* b, float* c) {
    for (int i = 0 i < M ++i) {
        for (int j = 0 j < N ++j) {
            float sum = 0
            for (int kk = 0 kk < K ++k) {
                sum += a[i * K + kk] * b[kk * N + j]
            }
            c[i * N + j] = sum
        }
    }
}

答题说明:该题为手动判卷,答案只要写对即可,不用严格满足字符比对。
2.
使用OpenMP或者Pthread对下面这段计算各行的积的累加的代码进行多...
问题详情

使用OpenMP或者Pthread对下面这段计算各行的积的累加的代码进行多线程优化。
int sum = 0
for (int i = 0 i < m ++i) {
    int temp = 1
    for (int j = 0 j < i ++j) {
        temp *= a[i * m + j]
    }
    sum += temp
}

答题说明:该题为手动判卷,答案只要写对即可,不用严格满足字符比对。
3.
时下有一款很流行的网络游戏名叫王者荣耀。在这款游戏中,通过消灭敌方小兵可以...
问题详情

时下有一款很流行的网络游戏名叫王者荣耀。在这款游戏中,通过消灭敌方小兵可以获得一些金钱。在你开始攻击一个小兵后,你会持续攻击直到完全消灭它为止。只有消灭它,你才能获得它的全额金钱。在这之前,你是不会从它身上获得金币收益的。

现在已知有totalKind种小兵总共n个。每种小兵的血量以及消灭它能够得到的金钱是相同的。你每次攻击能够对小兵造成的伤害都是一个确定的常量。同一次攻击只能攻击一个小兵。

请问,在你攻击k次以后,你最多能够获得多少金钱?

请通过完成下列函数来实现这一计算。其中,n是小兵的数量,k是你能攻击的次数,damage是你每次攻击所能造成的伤害,health[i]表示第i种小兵的血量,money[i]表示消灭一个第i种小兵能够获得的金钱,kind[i]表示第i个小兵所属的种类。

int MaxMoney(int n, int k, int totalKind, int damage, int health[], int money[], int kind[])

时间限制为1秒钟。内存限制为128MB

对于20%的数据,n <= 10

对于70%的数据,n <= 10000

对于100%的数据,n <= 100000, K <= 1000, totalKind <= 1000, damage <= 100, health[i] <= 1000, money[i] <= 1000
答题说明:该题为手动判卷,答案只要写对即可,不用严格满足字符比对。
4.
下列哪两条指令构成RAW型依赖关系?
问题详情




5.
对于乱序执行的处理器,下列哪个流水线阶段是乱序执行的?
问题详情




6.
关于NUMA架构,下列描述正确的是
问题详情




7.
下面伪代码程序: Class Base 构造函...
问题详情

下面伪代码程序:

Class Base

构造函数:Base(int i) { std::cout << i }

Class Base1: virtual public Base

构造函数:Base1(int i, int j=0) : Base(j) { std::cout << i }

Class Base2: virtual public Base

构造函数:Base2(int i, int j=0) : Base(j) { std::cout << i }

Class MM : public Base2, public Base1

构造函数:MM(int a, int b, int c, int d) : mem1(a), mem2(b), Base1(c),Base2(d),Base(a)

                                { std::cout << b }

       成员变量:

                     Base2 mem2

                     Base1 mem1

那么析构对象MM objD (1, 2, 3, 4)的输出为




8.
关于this指针使用说法错误的是
问题详情




9.
程序的局部变量存在于[$##$]中,全局变量存在于[$##$]中,动态申请...
问题详情

程序的局部变量存在于()中,全局变量存在于()中,动态申请数据存在于()中,变量放在堆区与栈区的区别是()。
10.
请写一个严谨的宏”MAX”,返回两个参数中较大的一个:[$##$]
问题详情

请写一个严谨的宏”MAX”,返回两个参数中较大的一个:()
11.
如何防止头文件被重复引用:[$##$]
问题详情

如何防止头文件被重复引用:()
12.
以下代码打印出的是:[$##$] char *p = new char...
问题详情

以下代码打印出的是:()
char *p = new char[10] 
printf("%d\n", sizeof(p)) 

13.
若一组记录的排序码为(32, 1, 52, 25, 88, 56),则利用...
问题详情

若一组记录的排序码为(32, 1, 52, 25, 88, 56),则利用快排的方法从小到大排序,以第一个记录为基准得到的一次划分结果为:()