C 使用OpenMP并行化程序的最佳方法是确保它可以扩展以有效利用现代多核处理器
我已经创建了一个C程序来计算函数y(x)=sin(nx)的值 n=1,2,3,4。常量C 使用OpenMP并行化程序的最佳方法是确保它可以扩展以有效利用现代多核处理器,c,multithreading,parallel-processing,openmp,hpc,C,Multithreading,Parallel Processing,Openmp,Hpc,我已经创建了一个C程序来计算函数y(x)=sin(nx)的值 n=1,2,3,4。常量M_PI在math.h头文件中定义 使用OpenMP并行化此程序以确保 它是否可以扩展以有效利用现代多核处理器 #include <stdio.h> #include <math.h> int main(){ const int NPOINTS=1001; const int NCURVES=4; double dtheta; double y[NCURVES]
M_PI
在math.h
头文件中定义
使用OpenMP并行化此程序以确保
它是否可以扩展以有效利用现代多核处理器
#include <stdio.h>
#include <math.h>
int main(){
const int NPOINTS=1001;
const int NCURVES=4;
double dtheta;
double y[NCURVES][NPOINTS];
double theta[NPOINTS];
dtheta = 2*M_PI / ( (float) (NPOINTS-1) );
for (int n=0; n<NCURVES; n++){
for(int i=0; i<NPOINTS; i++){
theta[i] = ( (float) i) * dtheta;
y[n][i] = sin( ((float) (n+1)) * theta[i]);
}
}
return 0;
}
#包括
#包括
int main(){
常量int NPOINTS=1001;
常数int曲线=4;
双dtheta;
双y[n曲线][n点];
双θ[n点];
dtheta=2*M_PI/(浮点数)(NPOINTS-1));
对于(int n=0;n您的示例非常简单,因为不存在循环依赖项或潜在的竞争条件。您只需按如下方式在线程之间分配两个循环的迭代:
#pragma omp parallel for collapse(2)
for (int n=0; n<NCURVES; n++){
for(int i=0; i<NPOINTS; i++){
theta[i] = ( (float) i) * dtheta;
y[n][i] = sin( ((float) (n+1)) * theta[i]);
}
}
您尝试了什么?使用#pragma omp parallel for collapse(2)
?除此之外,θ
的计算可以从循环中移开(并且需要避免并行竞争条件)。但是,不要期望这样一个小循环会有任何大的速度。好的编译器可以生成一个代码,它可以在几十微秒内计算出来,这通常比创建多线程所需的时间要短……要使多线程在这里发挥作用,您需要做更多的工作。的记忆((float)i)*dtheta
没有什么意义,因为现代CPU的计算速度比从计算机中获取数据快得多cache@tstanisl谢谢你的意见,我也有同样的感觉,但我不确定
#pragma omp parallel for
for (int i=0; i < NPOINTS; i++){
theta[i] = ((float) i) * dtheta;
for(int n=0; n < NCURVES; n++){
y[n][i] = sin( ((float) (n+1)) * theta[i]);
}
}
#pragma omp parallel for collapse(2)
for (int n=0; n<NCURVES; n++){
for(int i=0; i<NPOINTS; i++){
y[n][i] = sin( ((float) (n+1)) * ( (float) i) * dtheta);
}
}