我正在用这个GPU写我的大学论文
我在这个东西上运行了很多不同的内核,执行时间停留在12666.6689毫秒,即使我有一个有88条指令* 100m迭代的循环。
__kernel void scalar_mult_add(__global int * list)
{
unsigned int x=38;
unsigned int y=38;
for(int i=0; i<1000000 ; i++){
y=x*y;
x=x+y;
}
}唯一可以增加执行时间的方法是在for loop语句中添加x!=0
__kernel void scalar_mult_add(__global int * list)
{
unsigned int x=38;
unsigned int y=38;
for(int i=0; i<1000000 && x!=0 ; i++){
y=x*y;
x=x+y;
}
}为什么这种事情总是发生?我不能理解:例如,8800万条指令的执行时间与100万条指令的执行时间相同,尽管我没有那么多单元来同时执行如此大的内核,比如100万条指令。
为什么在循环中添加一条x!=0语句会使执行时间增加那么多,而在for循环中添加几条语句却不会?
发布于 2021-11-22 07:57:56
为什么在循环中添加一条x!=0语句会增加执行时间?
在最初的情况下,循环不做任何事情-输出不会保留,循环结果不会在任何进一步的计算中使用。正如上面的注释所指出的,编译器可能只是在优化循环。
将x != 0添加到循环条件检查意味着循环结果是“已使用的”-您需要之前的迭代循环结果来确定是否继续迭代。代码仍然没有意义(没有输出),但是编译器不认为这是死代码,所以它留在原处。
但是,请注意,Mali T624具有SIMD矢量单元。像这样编写一个独立的标量循环意味着你有效地杀死了编译器中的任何自动向量化。强烈建议使用vec4数据类型进行计算。
如果您想要一些基本的静态分析,您可能想要看一下Mali,它可以在Arm Mobile Studio中免费下载。请注意,编译OpenCL内核需要macOS或Linux,但如果您是在Windows上,则可以在WSL下运行Linux二进制文件。
https://stackoverflow.com/questions/70047928
复制相似问题