“如果条件”会影响OpenCL中内核执行的性能吗?

时间:2017-01-27 11:04:11

标签: opencl

我在图像上运行过滤器,然后执行垂直传递,然后执行水平传递。对于两个传递,此任务的功能都相同,只有参数值更改。我在一个循环中调用该函数。为了向量化该函数中的操作,我必须为两次传递编写单独的函数调用。现在循环对于水平和垂直通道是分开的。由于此更改,现在添加了“if条件”,并且我注意到即使计算是向量化的,内核也需要更长的时间来执行。我已经多次运行代码,使用矢量化代码所花费的平均时间比原始代码多。是因为代码插入了“if condition”吗?

原始代码

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);

1 个答案:

答案 0 :(得分:1)

您的意思是offset == 1吗?

if(offset = 1)

为偏移分配1,这是一个额外的延迟&#34;每个帖子。这比原来慢。但除此之外,&#34;如果&#34;根据分支的模式改变或改变性能&#34;采取&#34;或者&#34;没有采取&#34;由于某些体系结构(如GPU SIMD)会将气泡填充到并行SIMD流水线,因为这些流量不是与相邻流水线相同的分支选项,因此它们会留给其他波前线程。职业机会,如果他们不能填补,他们的表现会更差。

为了获得更好的表现,

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);

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

如果你可以将offset == 1个案例组合在一起,那么如果内存访问操作不会对它产生影响会更快。