c语言 - 这里的 omp 声明有什么问题?如何解决?



这是我的代码,它允许不同的线程计算conv2d并将结果合并回结果矩阵。

#pragma omp parallel private(tid)
float *gptr;
gptr = malloc(M * M * sizeof(float) / NUMTHREADS);
tid = omp_get_thread_num();
#pragma omp for
for (int i = 0; i < M; i++)
{
for (int j = 0; j < M; j++)
{
float tmp = 0.;
for (int k = 0; k < GW; k++)
{
int ii = i + k - W2;
for (int l = 0; l < GW; l++)
{
int jj = j + l - W2;
if (ii >= 0 && ii < M && jj >= 0 && jj < M)
{
tmp += float_m[k * M + l] * GK[ii * GW + jj];
}
}
}
*(gptr + (i - tid * M / NUMTHREADS) * M + j) = tmp;
}
}

但是声明pragma omp parallel private(tid)不能正常工作。它在下一行给出浮点声明的错误消息:

omp.c: In function 'main':.omp.c:86:5: error: expected expression before 'float'
float *gptr;     
^~~~~

哪里出了问题,如何解决?

你的平行区域比一行长,所以你必须使用大括号:

#pragma omp parallel private(tid)
{
//your code
}

更新-一个更精确的答案与参考:

根据OpenMP规范,并行结构的语法如下:

#pragma omp parallel [clause[ [,] clause] ... ] new-line
structured-block 

结构化块为:

一个可执行语句,可能是复合语句,带有一个顶部的入口和底部的单个出口,或者OpenMP建筑

复合语句的定义:

复合语句或块是声明和声明。

在您的代码中

#pragma omp parallel private(tid)
float *gptr;

float *gptr;不是可执行/复合语句/OpenMP构造,因此您会收到一条错误消息。您必须通过将代码放在{}之间来创建一个复合语句。

我发现您的代码有三个问题。

  1. 您的直接问题是需要在parallel区域的材料周围使用大括号
  2. 不太重要的是,考虑在i,j循环上放置一个collapse(2)
  3. 但最重要的是,您确定在并行区域中分配gptr是您想要的吗?这意味着每个线程都会创建自己的副本,并保持在并行区域的本地。您可能希望在外部进行分配,并将指针作为共享指针传入

最新更新