【发布时间】:2021-12-31 00:00:41
【问题描述】:
我在大学的论文中使用这个 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循环语句中添加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 循环中添加几项则不会?
【问题讨论】:
-
代码有恒定的输入并且不产生输出,编译器优化器可能很容易消除大部分(如果不是全部)代码
-
您检查过实际的编译器输出吗?你开启了什么优化级别?您拥有的第一个示例几乎可以被优化掉,因为循环并没有真正“做任何事情”。尝试查看实际的 ASM 输出。
-
您似乎禁用了编译器优化。 If you observe the generated assembly(在 CPU 上,诚然,因为这是我方便的)你的两个函数都可以优化到 nothing。因为这两个函数都没有明显的效果。
-
是的,我的 cpp 文件中有“-cl-opt-disable”。您会推荐使用另一个优化标志吗?我不需要内核的实际结果的原因是因为我不使用内核的结果,因为我只想验证 gpu 单元、管道深度并检查可用的单元(向量和标量)。我怎样才能让编译器不消除我没有效果的代码?
-
Mali 编译器没有禁用优化的选项。更改内核以保留输出,或在计算期间对循环值产生副作用。