免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: zhujiang73
打印 上一主题 下一主题

[算法] 行列分解 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
11 [报告]
发表于 2011-01-15 15:02 |只看该作者
本帖最后由 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 也有对应的库。
  1. __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)
  2. {
  3.         __private float4  aa[2048];
  4.         
  5.         float2  w_l;
  6.         
  7.         float4  a4,b4;
  8.         
  9.         int     p,dist;
  10.         
  11.         int  y = get_global_id(0);
  12.         
  13.         for (int j=0; j<nlen; j++)
  14.         {
  15.                 aa[j] = src[y*nlen+b[j]];
  16.         }

  17.         for(int lev=1; lev<=m; lev++)
  18.         {
  19.                 dist = 1<<(lev-1);
  20.                 for(int t=0; t<dist; t++)
  21.                 {
  22.                         p = t*(1<<(m-lev));

  23.                         for(int i=t; i<nlen; i+=1<<lev)
  24.                         {
  25.                                 w_l = w[p];
  26.                                 b4 = aa[i+dist];
  27.                                 
  28.                                 a4.x = b4.x*w_l.x - b4.y*w_l.y;
  29.                                 a4.y = b4.x*w_l.y + b4.y*w_l.x;

  30.                                 a4.z = b4.z*w_l.x - b4.w*w_l.y;
  31.                                 a4.w = b4.z*w_l.y + b4.w*w_l.x;
  32.                                 
  33.                                 aa[i+dist] = aa[i] - a4;
  34.                                 
  35.                                 aa[i] = aa[i] + a4;
  36.                         }

  37.                 }
  38.         }
  39.         
  40.         for (int j=0; j<nlen; j++)
  41.         {
  42.                 dst[y*nlen+j] = aa[j];
  43.         }

  44. }
复制代码

论坛徽章:
0
12 [报告]
发表于 2011-08-02 13:27 |只看该作者
CPU代码简单的翻译成OpenCL kernel执行效率不会提高太多,甚至可能会下降,即便高端GPU也不一定能比同档CPU强。如果是NVIDIA架构,global memory联合访问和local memory这两块优化好了,性能提高个四五倍不是问题。AMD的GPU不太清楚,但是也应该有类似的手段。FFT这东西成熟的典范太多,想在性能上有什么突破很难。而且好的算法互相都是有借鉴的,架构也比较复杂。就像Apple的OpenCL FFT,理念上极大的借鉴了FFTW。楼主如果有兴趣,可以拿这两个库对比一下看看性能差别

论坛徽章:
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
13 [报告]
发表于 2011-08-02 13:50 |只看该作者
CPU代码简单的翻译成OpenCL kernel执行效率不会提高太多,甚至可能会下降,即便高端GPU也不一定能比同档CPU ...
mercuryknight 发表于 2011-08-02 13:27



    我那个老式的 ATI4570 GPU 只能做最简单的运算,以后的 GPU 应该和 CPU 共享同一个内存空间,这样就方便多了。

论坛徽章:
0
14 [报告]
发表于 2011-08-04 01:30 |只看该作者
本帖最后由 mercuryknight 于 2011-08-04 01:56 编辑

回复 13# zhujiang73


CPU和GPU共享內存空间最大的问题不在于技术,而在于成本。技术上现在Intel和AMD都能做到,下一步从软件上把GPU编程的复杂度简化到跟CPU编程相似也不难做到。但是要GPU跟CPU一样去访问低速的系统内存,其优势就大大削弱了。反之要把系统内存整个都换成高端显卡上的高速GDDR,成本又会成倍上升。所以在可预见的未来几年,真正高性能科学计算领域,还得是GPU归GPU,CPU归CPU。短期内只有这种架构才是性能和成本之间的最佳平衡点。两者共享内存这种架构主要还是应对中低端家用电脑,去加速一些对性能不太敏感的日常应用。

另外你说AMD SDK里的FFT例子执行不了,可能是其他原因,并不是因为你GPU的问题。只要驱动支持OpenCL,理论上所有的OpenCL程序就应该都能跑。尤其这种官方自家出品的库,对自己硬件平台应该很了解,硬件参数也都可以在runtime获取,然后动态修改kernel,不至于因为某个硬件特征就彻底挂掉了。OpenCL总共才出了1.0,1.1两个版本,据我所知还没有把特定应用限制在特定平台上的情况出现,浮点精度问题除外,不过目前的OpenCL FFT默认设置应该都是单精度的,就算因为不支持双精度而出错,也会给出明确错误信息或警告。况且FFT算法用到的都是很常规的运算,就是加减乘除,sin,cos而已,没有理由某个GPU会运行不了。如果从程序代码本身角度考虑,有可能会发现原因。就像当初Apple的OpenCL FFT在我的Mac上跑的好好的,移植到linux下就各种问题。从PC的linux上移植到超级计算机的linux上又是各种问题。别看说的好听各种标准,有些时候还是需要自己动手去改的。毕竟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
15 [报告]
发表于 2011-08-05 10:02 |只看该作者
回复  zhujiang73


CPU和GPU共享內存空间最大的问题不在于技术,而在于成本。技术上现在Intel和AMD都能 ...
mercuryknight 发表于 2011-08-04 01:30



    "只要驱动支持OpenCL,理论上所有的OpenCL程序就应该都能跑。尤其这种官方自家出品的库,对自己硬件平台应该很了解,硬件参数也都可以在runtime获取,然后动态修改kernel,不至于因为某个硬件特征就彻底挂掉了。"


    ati的4* 系列没有 OpenCL 的正式支持,看错误提示好像是什么处理单元的数目不够。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP