我正在尝试学习OpenMP,但教授转到了另一个主题,我觉得我没有学到很多东西(或理解)。
在这里看了一些已解决的问题后,我写了这段代码:
现在,工作代码如下所示:
void many_iterations()
{
int it, i, j;
for (it = 0; it < NUM_ITERATIONS; it++)
{
#pragma omp parallel
{
#pragma omp for private(j)
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
{
if (i == j) B[i][j] = A[i][j] * 2;
else B[i][j] = A[i][j] * 3;
}
}
int **aux = A;
A = B; B = aux;
}
}
我还写了一个串行版本(没有#pragma omp位)并注意到这个版本实际上没有正常工作(输出A在串口和这个版本之间是不同的)。然后我设法将两个内部for循环更改为此工作位(据我所知,正确的输出):
for (index = 0; index < N * M; index++)
{
int i = index / M, j = index % M;
// rest of code here
这个确实有用,但我遇到了一个问题:在两个线程上运行,它和串行版本一样快(有两个内部fors),当我尝试用一个线程运行它时,执行时间是一个很慢。
在线阅读我明白并行部分应该以某种方式在main之前启动,以便减少开销,但同样,我的输出(A)是错误的。
所以我的问题是:
如何在不破坏代码的情况下在第一个之前设置#pragma omp parallel
?
为什么串行版本等于带有折叠for循环的代码的2线程版本?
在多线程上运行时,如何使代码更有效?
作为旁注,我尝试运行带有折叠for循环的串行版本,并且让它运行得慢得多(就像带有1个线程的“并行”版本)。
编辑:尝试在循环之前使用#pragma omp parallel
:
void many_iterations()
{
int it, i, j;
#pragma omp parallel
{
for (it = 0; it < NUM_ITERATIONS; it++)
{
#pragma omp for private(j)
for (i = 0; i < N; i++)
for (j = 0; j < M; j++)
{
if (i == j) B[i][j] = A[i][j] * 2;
else B[i][j] = A[i][j] * 3;
}
#pragma omp single
{
int **aux = A;
A = B; B = aux;
}
}
}
}