gpt4 book ai didi

c - OpenMP 优化?

转载 作者:行者123 更新时间:2023-11-30 14:28:03 27 4
gpt4 key购买 nike

我不明白为什么这个函数的性能这么差。我有一台 core 2 Duo 机器,我知道它只创建 2 个 trhead,所以它不是线程太多的问题。我预计结果会更接近我的 pthread 结果。

这些是我的编译标志(故意不做任何优化标志)gcc -fopenmp -lpthread -std=c99 矩阵Mul.c -o 矩阵Mul

这些是我的结果

Sequential matrix multiply: 2.344972
Pthread matrix multiply: 1.390983
OpenMP matrix multiply: 2.655910
CUDA matrix multiply: 0.055871
Pthread Test PASSED
OpenMP Test PASSED
CUDA Test PASSED
<小时/>
void openMPMultiply(Matrix* a, Matrix* b, Matrix* p)
{
//int i,j,k;
memset(*p, 0, sizeof(Matrix));
int tid, nthreads, i, j, k, chunk;
#pragma omp parallel shared(a,b,p,nthreads,chunk) private(tid,i,j,k)
{
tid = omp_get_thread_num();
if (tid == 0)
{
nthreads = omp_get_num_threads();
}
chunk = 20;
// #pragma omp parallel for private(i, j, k)
#pragma omp for schedule (static, chunk)
for(i = 0; i < HEIGHT; i++)
{
//printf("Thread=%d did row=%d\n",tid,i);
for(j = 0; j < WIDTH; j++)
{
//#pragma omp parallel for
for(k = 0; k < KHEIGHT ; k++)
(*p)[i][j] += (*a)[i][k] * (*b)[k][j];
}
}
}
}

感谢您的帮助。

最佳答案

由于矩阵乘法是一种令人尴尬的并行运算,因此在双核上其加速比应该接近 2。由于缓存未命中的减少,矩阵乘法甚至通常会表现出超线性加速(双核上大于 2)。通过查看您的代码,我没有看到明显的错误,但有些地方出了问题。这是我的建议:

  1. 只需仔细检查工作线程的数量。在你的情况下,应该创建 2 个线程。或者,尝试通过调用omp_set_num_threads进行设置。另外,查看 2 个核心是否得到充分利用(即 Windows 上的 CPU 利用率为 100%,Linux 上的 CPU 利用率为 200%)。

  2. 通过删除不必要的 nthreadschunk 来清理代码。这些可以在平行部分之外准备。但是,即使是这样,也不应该影响加速。

  3. 矩阵是方阵吗(即 HEIGHT == WIDTH == KHEIGHT)?如果它不是方阵,则可能会出现工作负载不平衡,从而影响加速。但是,考虑到 pthread 的加速(大约 1.6,这对我来说也很奇怪),我不认为存在太多的工作负载不平衡。

  4. 尝试使用默认的静态调度:不要指定chunk,只需编写#pragma omp for

  5. 我最好的猜测是,Matrix 的结构可能有问题。 Matrix 到底是什么样子的?在最坏的情况下,错误共享可能会严重损害性能。但是,在如此简单的矩阵乘法中,错误共享应该不是什么大问题。 (如果你不知道细节,我可以解释更多细节)。

  6. 尽管您注释掉了,但切勿将 #pragma omp parallel for 放在 for-k 处,这会导致嵌套并行循环。在矩阵乘法中,这绝对是浪费,因为最外面的循环是可并行的。

最后,尝试运行以下非常简单的 OpenMP 矩阵乘法代码,并查看加速情况:

double A[N][N], B[N][N], C[N][N];
#pragma omp parallel for
for (int row = 0; row < N; ++row)
for (int col = 0; col < N; ++col)
for (int k = 0; k < N; ++k)
C[row][col] += A[row][k]*B[k][col];

关于c - OpenMP 优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6780075/

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