这是我的代码,它允许不同的线程计算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构造,因此您会收到一条错误消息。您必须通过将代码放在{
和}
之间来创建一个复合语句。
我发现您的代码有三个问题。
- 您的直接问题是需要在
parallel
区域的材料周围使用大括号 - 不太重要的是,考虑在
i,j
循环上放置一个collapse(2)
- 但最重要的是,您确定在并行区域中分配
gptr
是您想要的吗?这意味着每个线程都会创建自己的副本,并保持在并行区域的本地。您可能希望在外部进行分配,并将指针作为共享指针传入