gpt4 book ai didi

c - 尽管处理器负载达到 100%,OMP 并行 for 并不会大幅加快循环速度

转载 作者:行者123 更新时间:2023-11-30 16:16:10 24 4
gpt4 key购买 nike

我正在尝试加快一些计算的速度,但尽管所有核心都忙于我的计算,但速度并没有太大提高。

在 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。使用 1 个核心时,我得到 0.23 秒,使用 2 个核心时,我得到 0.19 秒,使用 12 个核心时,我得到 0.163 秒,这甚至不是双倍速度。有或没有时间表或静态与动态时间表实际上没有任何区别。由于缺乏足够的内存,我无法为 in1 创建临时矩阵。错误共享不应该发生,因为 row1 数量如此之高,各个 block 应该相距很远,对吧?有人看出我这边有明显的错误吗?

最佳答案

我一眼注意到的唯一明显的错误是你假设多线程是无限制的。但事实并非如此。使用 4 个线程永远不会获得 4 倍的速度提升,因为初始化每个线程以及稍后合并它们都会产生成本。添加更多线程后,性能增益(以%为单位)往往会降低,这在测量中可以清楚地看到。为了更好地理解多线程的基本概念,您应该阅读一些基本的编程书籍。

我认为你应该尝试使用

#pragma omp for

带外循环的指令。 OMP 是高性能线程库,但程序员应该将其指令放在更好的位置,或者至少尝试不同的变体(如果没有明显的变体)。

根据我使用 OMP 的经验,omp_set_num_threads(12); 只是建议使用 12 个线程。

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

关于c - 尽管处理器负载达到 100%,OMP 并行 for 并不会大幅加快循环速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56733684/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com