我在图像上运行过滤器,然后执行垂直传递,然后执行水平传递。对于两个传递,此任务的功能都相同,只有参数值更改。我在一个循环中调用该函数。为了向量化该函数中的操作,我必须为两次传递编写单独的函数调用。现在循环对于水平和垂直通道是分开的。由于此更改,现在添加了“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);
答案 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个案例组合在一起,那么如果内存访问操作不会对它产生影响会更快。