尽管处理器负载量为100%,但C -OMP并行并不能大量加速循环



我正在尝试加快一些计算,尽管所有内核都忙于我的计算,但速度不大。

在Windows 10 64位的i7 7800(6个内核,12个线程(上运行。

#include "omp.h"
int i;
int j;
double tempval1;
double tempval2;
double tempval3;
int col1=4;
int row1=37500000;
double *in1 = (double *)malloc(col1 * row1 * sizeof (double));
double *inim1 = (double *)malloc(col1 * row1 * sizeof (double));
double *in2 = (double *)malloc(col1 * row1 * sizeof (double));
double *inim2 = (double *)malloc(col1 * row1 * sizeof (double));
double *in8 = (double *)malloc(col1 * sizeof (double));

omp_set_num_threads(12);
    for (i = 0; i < col1; ++i)
    {
        tempval3=in8[i];// in8 individual for each column
        #pragma omp parallel for private(tempval1,tempval2),schedule(dynamic,16384)
        for (j = i * row1; j < ((i + 1) * row1); ++j)
        {
            //For each element of the matrix, multiply in1 with in2, both real and imaginary part, but beforehand add in8 to in2 (only real and without altering original in2)
            tempval1=inim1[j] * inim2[j];// 
            tempval2=in1[j] * inim2[j];// 
            in1[j]=in1[j] * (in2[j] + tempval3) - tempval1;// only add to in2 but not inim2 because in8 is not complex
            inim1[j]=inim1[j] * (in2[j] + tempval3) + tempval2;  
        }
    }

例如,Col1为4,Row1为37500000。使用一个核心,我获得0.23秒,2核0.19秒,12个核心为0.163秒,甚至不是双速。有或没有脱水或静态与动态时间表的情况下,实际上并没有任何区别。由于缺乏足够的内存,我无法为IN1创建临时矩阵。错误的共享不应该发生,因为在如此高的Row1号码中,各个块应该是远处的,对吗?有人在我这一边看到一个明显的错误吗?

我发现的唯一明显的错误是您假设多线程是无海岸的。但这不是。您将永远不会有4个线程的4倍速度,因为初始化每个线程并以后将它们合并的成本。随着添加更多的线程,您可以在测量结果上可以清楚地看到更多的灌注(以百分比(降低。为了更好地了解多线程的基本概念,您应该阅读一些基本的编程书。

我认为您应该尝试使用

#pragma omp for

带有外循环的指令。OMP是高完美的线程库,但程序员应将其指示放在更好的地方,或者如果没有明显的情况,则至少尝试不同的变体。

我记得我在OMP omp_set_num_threads(12);的经验中只是使用12个线程的建议。

测量不同方法的速度,您的优化实践非常好。

相关内容

最新更新