我正在尝试加快一些计算,尽管所有内核都忙于我的计算,但速度不大。
在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个线程的建议。
测量不同方法的速度,您的优化实践非常好。