我的内核中有一个for循环,我已经硬编码迭代我的代码的固定数量的循环:
for (int kk = 0; kk < 50000; kk++)
{
<... my code here ...>
}
Run Code Online (Sandbox Code Playgroud)
我不认为循环中的代码与我的问题相关,它是一些非常简单的表查找和整数数学.
我想让我的内核代码更灵活,所以我修改了循环,以便我的循环(50000)的迭代次数被内核输入参数'num_loops'替换.
for (int kk = 0; kk < num_loops; kk++)
{
<... more code here ...>
}
Run Code Online (Sandbox Code Playgroud)
我发现的是,即使我的宿主程序调用内核
num_loops = 50000
Run Code Online (Sandbox Code Playgroud)
这是与之前硬编码值相同的值,我内核的性能几乎减少了一半.
我试图找出导致性能下降的原因.我想它与OpenCL编译器无法有效地展开循环有关?
有没有办法在不招致性能损失的情况下做我想做的事情?
更新:以下是使用"#pragma unroll"播放的一些结果
不幸的是,似乎展开循环并不能解决我的性能问题.
即使展开硬编码循环也会降低性能.
这是具有硬编码值的正常循环(最佳性能):
for (int kk = 0; kk < 50000; kk++)
// Time to execute = 0.18 (40180 Mi ops/sec)
Run Code Online (Sandbox Code Playgroud)
如果我展开循环,情况会变得更糟:
#pragma unroll
// or #pragma unroll 50000
for (int kk = 0; kk …Run Code Online (Sandbox Code Playgroud) opencl ×1