我正在尝试评估OpenCL for AMD之间的性能差异。我有针对hough transfrom的内核 在内核中,我运行内核时没有产生任何加速的#pragma unroll语句
kernel void hough_circle(read_only image2d_t imageIn, global int* in,const int w_hough,__global int * circle)
{
sampler_t sampler=CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST;
int gid0 = get_global_id(0);
int gid1 = get_global_id(1);
uint4 pixel;
int x0=0,y0=0,r;
int maxval=0;
pixel=read_imageui(imageIn,sampler,(int2)(gid0,gid1));
if(pixel.x==255)
{
#pragma unroll 20
for(int r=90;r<110;r+=1)
{
// int r=190;
#pragma unroll 360
for(int theta=0; theta<360;theta++)
{
x0=(int) round(gid0-r*cos( (float) radians( (float) theta) ));
y0=(int) round(gid1-r*sin( (float) radians( (float) theta) ));
// if((x0>0) && (x0<get_global_size(0)) && (y0>0)&&(y0<get_global_size(1)))
//in[w_hough*y0+x0]++;
}
}
}
}
#pragma unrol与AMD OpenCL协同工作
答案 0 :(得分:2)
展开确实适用于AMD。
http://developer.amd.com/tools-and-sdks/heterogeneous-computing/codexl/
该工具包括kernelanalyzer,它允许您查看其编译器的实际输出。我用它来验证展开实际上确实产生了不同的内核。
然而,展开循环并不一定能为您带来任何加速。毕竟它只是以节目大小为代价来节省跳转指令,而在GPU中你通常会受到内存延迟的限制。
在你的情况下,瓶颈可能是sin / cos函数,这些在AMD HW上也很慢(也在其他GPU上)。您应该使用native_sin和native_cos。它们不是那么精确,并且不支持与正常范围一样长的范围,这就是为什么它们默认不使用它们,但在大多数情况下它们就足够了。 native_ functions的精度与DirectX着色器对sin和cos的要求相同。