1、Vector编程范式不包含的任务流程为(A)
A. Split
B. CopyOut
C. CopyIn
D. Compute
解析:Vector编程范式包含的主要任务流程为:将数据从主机(Host)内存复制到设备(Device)内存(CopyIn)、在设备上执行计算(Compute)、将计算结果从设备内存复制回主机内存(CopyOut)。Split不是Vector编程范式中的任务流程,它是指将数据分成多个块,以便并行处理。
2、CopyIn任务中将输入数据从Global内存搬运至Local内存后,需要使用什么操作将LocalTensor放入VECIN的Queue中(B)
A. DeQue
B. EnQue
C. DataCopy
D. Copy
解析:在 CopyIn 任务中,将输入数据从 Global 内存复制到 Local 内存后,需要将 LocalTensor 放入 VECIN 的队列中,以便后续 Compute 任务使用。这个操作使用的是 EnQue(入队)操作,将 LocalTensor 放入 VECIN 队列中等待后续任务使用。DeQue(出队)操作则是从队列中取出数据。DataCopy 和 Copy 是数据复制的操作,不涉及队列操作。
3、TIK C++算子核函数指针入参变量可以定义的类型为(D)
A. float
B. double
C. int
D. __gm__ uint8_t*
解析:在 Tik C++ 算子开发中,核函数指针(Kernel Function Pointer)是一种用于定义算子计算逻辑的方式。Tik 算子核函数指针的入参变量类型可以是 gm uint8_t*,也就是指向 Global 内存中 uint8_t 类型数据的指针。这是因为 Tik 算子计算逻辑是在昇腾处理器上执行的,而昇腾处理器的内存模型是基于 Global 内存和 Local 内存的,因此需要使用 gm 关键字来标识 Global 内存中的数据。其他选项中的 float、double 和 int 是基本数据类型,可以作为算子核函数指针的入参,但需要使用 __ai __ 关键字来标识 AI Core 内存中的数据。
4、开发TIK C++算子核函数返回类型为(A)
A. void
B. int
C. float
D. __gm__ uint8_t*
解析:在 Tik C++ 算子开发中,算子核函数指针的返回类型通常是 void 类型。这是因为 Tik 算子计算逻辑一般是在昇腾处理器上执行的,计算结果会被写入到输出 Tensor 的内存中,而不是通过返回值返回。因此,算子核函数指针的返回类型通常为 void。其他选项中的 int、float 和 gm uint8_t* 都不是常见的算子核函数指针的返回类型。
5、TIK C++算子开发语言为(D)
A. Python
B. Java
C. Go
D. C++
解析:课程名就已经很明显了
1、小王开发算子时有代码DataCopy(src0Local, src0Global, calCount), 根据API限制条件,calCount的正确的值可能为(D)
A. 1
B.2
C. 3
D. 32
解析:根据 Tik C++ 算子开发文档中的说明,DataCopy 函数的参数 calCount 表示需要复制的数据块数量,每个数据块的大小为 32 字节。因此,正确的 calCount 值应该是 32,这样才能将 32 个 32 字节的数据块从 src0Global 复制到 src0Local 中。
2、假设InitBuffer时设置的内存长度为512B,那么调用AllocTensor的Tensor占用大小为(C)
A. 128B
B. 256B
C. 512B
D. 1024B
解析:在 Tik C++ 算子开发中,AllocTensor 函数用于分配 Tensor 内存。假设在 InitBuffer 时设置的内存长度为 512B,那么调用 AllocTensor 函数时,Tensor 占用的内存大小应该是 512B。这是因为 Tensor 的内存大小由 InitBuffer 函数中设置的内存长度决定,而 AllocTensor 函数只是为 Tensor 分配内存,并不改变 Tensor 的内存大小。
3、TIK C++最易用的接口级别为(D)
A. 0级
B. 1级
C. 2级
D. 3级
解析:在 Tik C++ 算子开发中,API 分为不同的级别,包括 0 级、1 级、2 级和 3 级。其中,在 3 级接口中,提供了一系列的高级 API,可以方便地实现算子的开发和调试,而不需要太多底层的知识和经验。2 级接口提供了更底层的 API,需要开发者具备一定的底层知识和编程经验,用于实现更加复杂的算子。0 级和 1 级接口则更为底层,一般不建议开发者直接使用。
4、小王开发算子,在设备侧实现算子功能时他可以(AB)
A. 调用TIK C++提供的接口实现算子功能
B. 使用+, -, *, /实现算子功能
C. 使用cmath内函数实现算子功能
D. 使用Eigen实现算子功能
解析:在设备侧实现算子功能时,小王既可以调用 Tik C++ 提供的接口实现算子功能,也可以使用 C++ 的加减乘除运算符实现算子功能。选项 A 和 B 都是正确的答案。
选项 C 中的 cmath 库函数可以用于实现一些数学计算,但具体使用情况需要根据算子功能的具体需求来决定。选项 D 中的 Eigen 库是一个 C++ 的线性代数库,可以用于实现矩阵乘法、矩阵分解等计算。但是,在 Tik C++ 算子开发中并不一定需要使用 Eigen 库,具体是否使用取决于算子功能的具体需求和开发者的个人喜好。
5、小王想实现一个add算子,那么他可能会使用的代码为(AB)
A. Add(zLocal, xLocal, yLocal, TILE_LENGTH);
B. zLocal = xLocal + yLocal
C. Adds(dstLocal, srcLocal, TILE_LENGTH);
D. Sub(zLocal, xLocal, yLocal, TILE_LENGTH);
解析:选项 A 使用的是 Tik C++ 算子开发中提供的 API Add(zLocal, xLocal, yLocal, TILE_LENGTH),用于将两个 Tensor 相加,并将结果写入到第三个 Tensor 中。参数 zLocal 表示结果 Tensor 的 Local 内存地址,xLocal 和 yLocal 分别表示两个输入 Tensor 的 Local 内存地址,TILE_LENGTH 是数据块的大小。
选项 B 使用的是 C++ 的加法运算符 zLocal = xLocal + yLocal,这种写法相对于选项 A 而言更加简洁。但需要注意的是,这种写法可能会对算子的性能产生一定的影响。
选项 C 中的 Adds 函数在 Tik C++ 算子开发文档中不存在,因此也不是最佳答案。
选项 D 中使用了减法运算符,与题目要求的 add 算子不符合,因此也不是最佳答案。
1、小王开发算子时,没有写CopyOut函数实现代码,那么他在cpu域调试时可能会发现(D)
A. 无影响
B. 计算结果全部为1
C. 计算结果部分为0
D. 计算结果全部为0
解析:在 Tik C++ 算子开发中,如果没有正确编写 CopyOut 函数,可能会导致在 NPU 域中计算结果无法正确返回到 CPU 域。因此,在 CPU 域调试时可能会发现计算结果全部为 0 的情况。这是因为在 CPU 域中读取 NPU 域的计算结果时,由于没有正确实现数据复制,因此读取到的数据全部为 0。
选项 A、B、C 都不是正确的答案。如果没有正确编写 CopyOut 函数,应该会影响计算结果。而具体影响的程度取决于算子的实现方式和具体问题。
2、小王开发算子单核运算时,CopyOut函数内的DataCopy(src0Local, src0Global, calCount)传入的calCount(大于0)值小于实际应传入的值,那么他在做cpu域调试精度时可能会发现(C)
A. 无影响
B. 计算结果全部为1
C. 计算结果部分为0
D. 计算过程报错
解析:在 Tik C++ 算子开发中,如果在 CopyOut 函数内的 DataCopy 函数传入的 calCount 值小于实际应传入的值,可能会导致数据复制不完整,从而影响计算的结果。因此,在 CPU 域调试精度时,可能会发现计算结果部分为 0 的情况。
选项 A、B、D 都不是正确的答案。如果数据复制不完整,应该会影响计算结果。而具体影响的程度取决于算子的实现方式和具体问题。
3、算子类实现中算子功能实现是在哪个函数中完成的(C)
A. Init
B. CopyIn
C. Compute
D. CopyOut
解析:在 Tik C++ 算子开发中,算子类实现中的算子功能实现通常是在 Compute 函数中完成的。Compute 函数是 Tik C++ 算子类中的一个虚函数,用于实现算子的功能。在 Compute 函数中,开发者可以调用 Tik C++ 提供的 API 或者其他库函数来实现算子的功能。Compute 函数会在 NPU 域中执行,用于执行计算操作并返回计算结果。
选项 A、B、D 中的函数都是 Tik C++ 算子类中的函数,但是它们和算子功能的实现没有直接关系。Init 函数用于初始化算子类中的各个参数,CopyIn 函数用于将输入数据从 CPU 端复制到 NPU 端,CopyOut 函数用于将计算结果从 NPU 端复制到 CPU 端。
4、小王做算子调试时发现CPU域调试精度无问题,NPU域调试时编译报错,那么可能会出现这种场景的原因是(AC)
A. 小王调用了cmath函数实现算子功能
B. 小王在代码内添加了Add 计算API
C. 小王在代码内添加了std::cout打印
D. 小王在代码运算时使用了 + 号
解析:在 Tik C++ 算子开发中,CPU 和 NPU 使用的指令集不同,因此在算子调试时可能会出现 CPU 域调试精度无问题,但是 NPU 域调试时编译报错的情况。这种情况的原因有很多,但常见的原因包括:
在代码中调用了 CPU 端的库函数,但这些函数在 NPU 端无法使用。例如,标准 C++ 库中的一些函数,如 printf()、sin() 等,在 NPU 端无法使用。
在代码中使用了一些 CPU 端特有的语言特性,而这些特性在 NPU 端无法使用。例如,一些编译器扩展功能、inline assembly 语句等。
在代码中使用了一些调试用的函数或语句,例如 std::cout 打印、assert() 断言等,这些函数在 NPU 端无法使用因此,选项 A 和 C 都是可能导致这种场景出现的原因。选项 B 中提到的 Add 计算 API 在 CPU 和 NPU 端的实现是相同的,不会影响编译。选项 D 中的加号运算符在 CPU 和 NPU 端的实现也是相同的,不会影响编译。
5、小王开发算子后发现算子实际执行结果与预期不符,小王一般应该通过下列哪些方法进行定位(AB)
A. 通过gdb调试定位问题
B. 通过添加打印调试定位问题
C. 重启设备解决问题
D. 更换环境重新测试
解析:在 Tik C++ 算子开发中,如果算子实际执行结果与预期不符,一般可以通过调试来定位问题。常见的调试方法包括使用 gdb 调试器进行调试和添加打印语句进行调试。
使用 gdb 调试器可以在程序执行时暂停程序并查看程序状态,例如查看变量的值、查看函数的调用栈等,从而帮助开发者定位问题。在进行调试时,需要编译程序时加上 -g 选项,以便在程序中插入调试信息。具体使用方法可以参考 gdb 的官方文档。
添加打印语句可以在程序执行时输出一些调试信息,例如变量的值、函数的执行路径等。这种方法相对简单,但需要开发者有一定的经验和判断力,以避免程序因为打印语句过多而导致性能下降或者输出信息过多而难以分析。
选项 C 和 D 都不是正确的答案。重启设备或更换环境并不能直接解决问题,而是需要通过调试等方法来找到问题的根源。