免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11919 | 回复: 14
打印 上一主题 下一主题

[算法] 行列分解 2D FFT OpenCL 并行化 [复制链接]

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-01-13 12:37 |只看该作者 |倒序浏览
本帖最后由 zhujiang73 于 2011-01-13 12:42 编辑

搞了大约两周,其间大部分时间用在补习有关理论上了,上学时学的高数忘了不少了。

先把这个算法:

是这样的?  google  到这个:
zhujiang73 发表于 2010-12-29 10:42



改一下:
  1.         for(int i = 0; i < mLen / 2; i++)
  2.         {
  3.                 float dAngle = -2 * FPI * i / mLen;
  4.                 W[i].real = (float)cos(dAngle);
  5.                 W[i].image = (float)sin(dAngle);
  6.         }

  7.         reverse(a,b,mLen,M);
复制代码
  1. void reverse(int *a, int *b, int len, int M)
  2. {
  3.     int i,j;

  4.     for(i=0; i<M; i++)
  5.     {
  6.         a[i] = 0;
  7.     }

  8.     b[0] = 0;
  9.     for(i=1; i<len; i++)
  10.     {
  11.         j = 0;
  12.         while(a[j] != 0)
  13.         {
  14.             a[j] = 0;
  15.             j++;
  16.         }

  17.         a[j] = 1;
  18.         b[i] = 0;
  19.         for(j=0; j<M; j++)
  20.         {
  21.             b[i] = b[i]+a[j]*(int)pow(2,M-1-j);
  22.         }
  23.     }
  24. }
复制代码
  1. void fft(zcomplex *A, zcomplex *W, int fft_nLen, int fft_M)
  2. {
  3.         int p,dist;
  4.         zcomplex C,B;

  5.         for(int lev=1; lev<=fft_M; lev++)
  6.         {
  7.                 dist = 1<<(lev-1);
  8.                 for(int t=0; t<dist; t++)
  9.                 {
  10.                         p = t*(1<<(fft_M-lev));

  11.                         for(int i=t; i<fft_nLen; i+=1<<lev)
  12.                         {
  13.                                 B = Mul(A[i+dist],W[p]);
  14.                                 C = Add(A[i],B);
  15.                                 A[i+dist] = Sub(A[i],B);
  16.                                 A[i].real = C.real;
  17.                                 A[i].image = C.image;
  18.                         }

  19.                 }
  20.         }
  21. }
复制代码
然后再用 OpenCL 并行化,同时计算多行的 FFT,计算结果转置,再算一遍再转置回来就行了:
  1. __kernel void fft4_nx( __global float4 *A,  __global const float2 *W,  const int nlen, const int fft_M)
  2. {
  3.         float4  f4_b;

  4.         int i;
  5.         int lev,dist,p,t;
  6.         
  7.         float2  w_l;
  8.         float4  f4_tmp;
  9.         float4  f4_tmp01;
  10.         float4  f4_tmp02;
  11.         
  12.         float4   a4,b4;
  13.         
  14.         int  y = get_global_id(0);

  15.         for(lev=1; lev<=fft_M; lev++)
  16.         {
  17.                 dist = 1<<(lev-1);
  18.                 for(t=0; t<dist; t++)
  19.                 {
  20.                         p = t*(1<<(fft_M-lev));

  21.                         for(i=t; i<nlen; i+=1<<lev)
  22.                         {
  23.                                 w_l = W[p];
  24.                                 b4 = A[y*nlen+i+dist];
  25.                                 f4_b.x = b4.x*w_l.x - b4.y*w_l.y;
  26.                                 f4_b.y = b4.x*w_l.y + b4.y*w_l.x;

  27.                                 f4_b.z = b4.z*W[p].x - b4.w*W[p].y;
  28.                                 f4_b.w = b4.z*W[p].y + b4.w*W[p].x;
  29.                                 
  30.                                 a4 = A[y*nlen+i];
  31.                                 
  32.                                 A[y*nlen+i+dist] = a4 - f4_b;
  33.                                 
  34.                                 A[y*nlen+i] = a4 + f4_b;
  35.                         }

  36.                 }
  37.         }
  38. }
复制代码

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
2 [报告]
发表于 2011-01-13 13:01 |只看该作者
回复 1# zhujiang73


    可惜我的入门级 ATI4570 显卡不太给力,用了 GPU 的程序的计算速度和 T6670 CPU 上对应算法单线程程序速度差不多,估计如果是中高端显卡用了 GPU 的程序速度应该快很多。

论坛徽章:
0
3 [报告]
发表于 2011-01-13 13:27 |只看该作者
虽然不懂OpenCL,但这绝对是个有趣的东西

论坛徽章:
0
4 [报告]
发表于 2011-01-13 13:34 |只看该作者
回复  zhujiang73


    可惜我的入门级 ATI4570 显卡不太给力,用了 GPU 的程序的计算速度和 T6670 CP ...
zhujiang73 发表于 2011-01-13 13:01



   
怎么得知这块运算的瓶颈?

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
5 [报告]
发表于 2011-01-13 13:56 |只看该作者
怎么得知这块运算的瓶颈?
erlangs 发表于 2011-01-13 13:34



    FFT 的瓶颈就是那一大堆的复数运算,把多个 1D FFT 运算并行应该是可以加速的。

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
6 [报告]
发表于 2011-01-13 14:01 |只看该作者
虽然不懂OpenCL,但这绝对是个有趣的东西
erlangs 发表于 2011-01-13 13:27



    OpenCL 是显卡的第二职业,不打游戏时还可以算数学题。

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
7 [报告]
发表于 2011-01-13 15:18 |只看该作者
高深!

论坛徽章:
0
8 [报告]
发表于 2011-01-14 09:22 |只看该作者
任何显卡都能openCL?

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
9 [报告]
发表于 2011-01-14 12:03 |只看该作者
回复 1# zhujiang73


    这个 kernel 其实不太好,global 数据访问太多了,但是它比较简单,在我的 ATI4570 上能跑,AMD OpenCL SDK 里的 FFT 例子算法应该更好,但是我的显卡不支持,估计是需要 ATI5* 系列以上的显卡。{:3_201:}

论坛徽章:
24
狮子座
日期:2013-12-31 10:48:0015-16赛季CBA联赛之吉林
日期:2016-04-18 14:43:1015-16赛季CBA联赛之北控
日期:2016-05-18 15:01:4415-16赛季CBA联赛之上海
日期:2016-06-22 18:00:1315-16赛季CBA联赛之八一
日期:2016-06-25 11:02:2215-16赛季CBA联赛之佛山
日期:2016-08-17 22:48:2615-16赛季CBA联赛之福建
日期:2016-12-27 22:39:272016科比退役纪念章
日期:2017-02-08 23:49:4315-16赛季CBA联赛之八一
日期:2017-02-16 01:05:3415-16赛季CBA联赛之山东
日期:2017-02-22 15:34:5615-16赛季CBA联赛之上海
日期:2017-11-25 16:17:5015-16赛季CBA联赛之四川
日期:2016-01-17 18:38:37
10 [报告]
发表于 2011-01-14 12:13 |只看该作者
任何显卡都能openCL?
wsw1wsw2 发表于 2011-01-14 09:22



    AMD 系的显卡,推荐 ATI5* 以上的。

    NV  系的我没注意,不过 NV 搞通用计算比较早,支持得应该不错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP