- 论坛徽章:
- 24
|
本帖最后由 zhujiang73 于 2011-01-15 15:32 编辑
回复 zhujiang73
这个 kernel 其实不太好,global 数据访问太多了,但是它比较简单,在我的 ATI ...
zhujiang73 发表于 2011-01-14 12:03 ![]()
![]()
改进一下 kernel ,开一个 __private 数组当缓存,看起来有点笨,但是真的可以加速。 {:3_189:}
建议有 ATI5* 以上显卡的程序员试试 AMD Math Libraries ,资料上说在中高端显卡上用 OpenCL 可以轻松使并行程序提速几十倍,如果是 N 卡 NV 也有对应的库。- __kernel void fft4_nx( __global const float4 *src, __global float4 *dst, __global const float2 *w, __global const int *b, const int nlen, const int m)
- {
- __private float4 aa[2048];
-
- float2 w_l;
-
- float4 a4,b4;
-
- int p,dist;
-
- int y = get_global_id(0);
-
- for (int j=0; j<nlen; j++)
- {
- aa[j] = src[y*nlen+b[j]];
- }
- for(int lev=1; lev<=m; lev++)
- {
- dist = 1<<(lev-1);
- for(int t=0; t<dist; t++)
- {
- p = t*(1<<(m-lev));
- for(int i=t; i<nlen; i+=1<<lev)
- {
- w_l = w[p];
- b4 = aa[i+dist];
-
- a4.x = b4.x*w_l.x - b4.y*w_l.y;
- a4.y = b4.x*w_l.y + b4.y*w_l.x;
- a4.z = b4.z*w_l.x - b4.w*w_l.y;
- a4.w = b4.z*w_l.y + b4.w*w_l.x;
-
- aa[i+dist] = aa[i] - a4;
-
- aa[i] = aa[i] + a4;
- }
- }
- }
-
- for (int j=0; j<nlen; j++)
- {
- dst[y*nlen+j] = aa[j];
- }
- }
复制代码 |
|