并行计算提升32K*32K点(32位浮点数) FFT计算速度(4核八线程E3处理器)
2016-03-23 14:35
465 查看
对32K*32K的随机数矩阵进行FFT变换,数的格式是32位浮点数。将产生的数据存放在堆上,对每一行数据进行N=32K的FFT,记录32K次fft的时间。
比较串行for循环和并行for循环的运行时间。
最终的运行时间:247,844,013 us
而串行fft,不调用openmp,它的运行时间为: 779,387,651 us
测试了,将32k*32k float型矩阵存储在堆上和栈上,并对比运行时间: 几乎没有区别。
查阅资料:栈的大小为1M, 大数组应该放在堆上,或者通过定义成全局变量/静态变量放在静态存储区。
fft算法:(该fft算法,不适合并行化处理,将来会寻找能够进行并行化的fft算法,继续改进)
比较串行for循环和并行for循环的运行时间。
//并行计算 //调用openmp,通过g++ -fopenmp test.cpp -o out 编译程序 #pragma omp parallel for for(int i=0;i<LEN;i++) fft(num[i],LEN,0);
最终的运行时间:247,844,013 us
而串行fft,不调用openmp,它的运行时间为: 779,387,651 us
测试了,将32k*32k float型矩阵存储在堆上和栈上,并对比运行时间: 几乎没有区别。
查阅资料:栈的大小为1M, 大数组应该放在堆上,或者通过定义成全局变量/静态变量放在静态存储区。
fft算法:(该fft算法,不适合并行化处理,将来会寻找能够进行并行化的fft算法,继续改进)
void fft(complex<float> *x, int n, int inv) { complex<float> u, w, t, tt; int m, nv2, nm1, l, le1, le, i, j, k, ip; m = int(log(double(n)) / log(2.) + 0.5); nv2 = n / 2; nm1 = n - 1; j = 0; for (i = 0; i<nm1; i++) { if (i >= j) goto a; tt = x[j]; x[j] = x[i]; x[i] = tt; a: k = nv2; b: if (k>j) goto c; j = j - k; k = k / 2; goto b; c: j = j + k; } for (l = 1; l <= m; l++){ le = int(pow(2.0, double(l))); le1 = le / 2; u = complex<float>(1.0 , 0.0); w = complex<float>((float)cos(pi / le1), -(float)sin(pi / le1)); if (inv != 0) w = conj(w); for (j = 0; j<le1; j++){ for (i = j; i<n; i = le + i){ ip = i + le1; t = x[ip] * u; x[ip] = x[i] - t; x[i] = x[i] + t; } u = u*w; } } if (inv != 0) { for (i = 0; i<n; i++){ x[i] = x[i] / float(n); } } }
相关文章推荐
- POJ 1832 Stripies(贪心)
- Linux命令 crontab
- 基于TestNG 与Selenium 的自动化测试设计与实施(三)
- ReentrantLock
- spring3.1以上利用 ehcache进行注解配置缓存不起作用的原因
- jQuery.serialize() 函数详解
- POJ 2236 Wireless Network
- 浅谈MySQL数据库查询优化
- DB2 查看历史备份信息
- android知识点汇总
- mybatis在spring中使用批量插入
- Android Handler 异步消息处理机制的妙用 创建强大的图片加载类
- struts2 切换jar包版本的时候,idea造成jar包重复...导致错误
- bzoj 1458 士兵占领(最大流)
- #8号板测试汇总
- Hive取非Group by字段数据的方法
- leetcode--Best Time to Buy and Sell Stock
- Fragment详解(四)Fragment生命周期
- Android 截屏并保存
- Android安全专项-Apk加固