並行計算提升32K*32K點(32位浮點數) FFT計算速度(4核八線程E3處理器)


  對32K*32K的隨機數矩陣進行FFT變換,數的格式是32位浮點數。將產生的數據存放在堆上,對每一行數據進行N=32K的FFT,記錄32K次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);
}
}
}

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com