C 简单的OpenMP循环在缩放时非常慢
这应该是一个相当简单的问题,但我在尝试运行基本的 OpenMP中的嵌套for循环C 简单的OpenMP循环在缩放时非常慢,c,multithreading,parallel-processing,multiprocessing,openmp,C,Multithreading,Parallel Processing,Multiprocessing,Openmp,这应该是一个相当简单的问题,但我在尝试运行基本的 OpenMP中的嵌套for循环 for(z=start;z<=end;z++){ offset=sizeof(int)*(z*r*c); fseek(fpIn,offset,SEEK_SET); fread(tempbuffer,sizeof(int),r*c,fpIn); #pragma omp parallel for collapse(2) private(x,y,z) schedule(static
for(z=start;z<=end;z++){
offset=sizeof(int)*(z*r*c);
fseek(fpIn,offset,SEEK_SET);
fread(tempbuffer,sizeof(int),r*c,fpIn);
#pragma omp parallel for collapse(2) private(x,y,z) schedule(static)
for(y=0;y<c;y++){
for(x=0;x<r;x++){
if(z>=z0 && z<z1 && y>=y0 && y<y1 && x>=x0 && x<x1){
volbuffer[y*c+x] = proc(tempbuffer[y*c+x]);
}
}
}
fseek(fpOut,offset,SEEK_SET);
fwrite(volbuffer,sizeof(int),r*c,fpOut);
}
使用OpenMP:
0.516495 seconds
0.511104 seconds
0.508267 seconds
0.521731 seconds
我使用的是i7 8550U,如果它很重要当您声称缩放效果不佳时,您应该提供数字。
c
和r
的值是什么?单个调用proc()
需要多长时间?你得到了什么?你期待什么?给出数字、硬件描述,必要时显示proc
的源代码。我怀疑这里的任何人都有水晶球可以告诉他们这些细节。我已经添加了一些额外的信息,我希望这些信息会有用,还有什么我需要澄清的吗?那么你有81个对一个函数的调用,其中添加了5个?仅设置OpenMP并行区域所需的时间就要长几个数量级。此外,collapse(2)
导致从单个线性索引中重新创建x
和y
,这引入了整数除法和模运算,而不是最快的运算。只需检查您的程序是否正确计时。如果测量CPU时钟,则OpenMP代码将显示所有内核上的组合CPU时钟。检查此项以确保您使用了正确的计时:这样的计时矩阵非常小,我想end start
应该很大。因此,几乎所有的时间都应该花在基于IO的操作上,因此最好关注这一部分……当您声称扩展性差时,您应该提供数字。c
和r
的值是什么?单个调用proc()
需要多长时间?你得到了什么?你期待什么?给出数字、硬件描述,必要时显示proc
的源代码。我怀疑这里的任何人都有水晶球可以告诉他们这些细节。我已经添加了一些额外的信息,我希望这些信息会有用,还有什么我需要澄清的吗?那么你有81个对一个函数的调用,其中添加了5个?仅设置OpenMP并行区域所需的时间就要长几个数量级。此外,collapse(2)
导致从单个线性索引中重新创建x
和y
,这引入了整数除法和模运算,而不是最快的运算。只需检查您的程序是否正确计时。如果测量CPU时钟,则OpenMP代码将显示所有内核上的组合CPU时钟。检查此项以确保您使用了正确的计时:这样的计时矩阵非常小,我想end start
应该很大。因此,几乎所有的时间都应该花在基于IO的操作上,因此最好关注这一部分。。。
0.516495 seconds
0.511104 seconds
0.508267 seconds
0.521731 seconds