"if conditions"会影响 OpenCL 中内核执行的性能吗?



我正在对图像运行过滤器,然后执行垂直传递,然后执行水平传递。此任务的函数对于两个传递是相同的,只是参数值发生了变化。我在循环中调用该函数。为了向量化该函数中的操作,我必须为这两个传递编写单独的函数调用。现在,水平刀路和垂直刀路的环路是分开的。由于此更改,现在添加了"if 条件",我注意到即使计算被矢量化,内核也需要更长的时间来执行。我已经运行了几次代码,矢量化代码所花费的平均时间超过了原始代码。是因为代码中插入了"if 条件"吗?

原始代码

global int* a;
for(int i = 0; i < 4; i++)
{
    filter(a + i, b, c);
}

修改后的代码

global int* a;
if(offset == 1)
for(int i = 0; i < 4; i++)
{
    filter_vertical(a + i, b, c);
}
else
    filter_horizontal(a, b, c);

你是说offset == 1吗?

if(offset = 1)

将 1 分配给偏移量,这是每个线程的"额外延迟"。这比原始速度慢。但除此之外,"if"会根据组合在一起的分支"采取"或"未采取"的模式向上或向下更改性能,因为某些架构(如 GPU SIMD)会在并行 SIMD 流水线与相邻流水线不是同一分支选项时填充气泡,因此它们留给其他波前线程的占用机会, 如果他们不能填充Neiter,它的性能就会降低。

为了获得更高的性能,

for(int i = 0; i < 4; i++)
{
    filter_vertical(a + i, b, c);
}

    filter_vertical(a , b, c);
    filter_vertical(a + 1, b, c);
    filter_vertical(a + 2, b, c);
    filter_vertical(a + 3, b, c);

需要更多的指令缓存,但需要更少的分支,需要更少的内存使用和更少的周期。

如果可以将偏移量 == 1 个案例分组在一起,如果内存访问操作不会影响它,它会更快。

最新更新