小编Cia*_*ano的帖子

OpenCL内核中的变量'for-loop'降低了性能

我的内核中有一个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

3
推荐指数
1
解决办法
3670
查看次数

标签 统计

opencl ×1