C 简单的OpenMP循环在缩放时非常慢

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

这应该是一个相当简单的问题,但我在尝试运行基本的 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(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