我试图对我制作的旧矩阵乘法程序进行矢量化,特别是这个函数在openmp中使用并行调用。我一直收到这个错误:
matrix_multiply.c(26): error: invalid entity for this variable list in omp clause
#pragma omp parallel for schedule(static) default(shared) private(i,j,k,sum)
我非常感谢任何帮助,因为我已经尝试查找错误,但无法找到任何有用的文档。如果这会产生影响,我会使用ICC进行编译。
void matrix_mult(int * matrix_A, int * matrix_B, int n)
{
#pragma omp parallel for schedule(static) default(shared) private(i,j,k,sum)
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
int sum = 0;
for (int k = 0; k<n; k++)
{
int index_a = i * n +k;
int index_b = j + k * n;
sum += matrix_A[index_a] * matrix_A[index_b];
}
matrix_B[i * n + j] = sum;
}
}
}
答案 0 :(得分:2)
这里有两件值得一提的事情:
private
指令中列出的变量。实际上,如果您仔细观察,i
,j
,k
和sum
都不会在指令行之前声明。所以对于编译器来说,它们还不存在。事实上,由于你只需要在parallel
区域内需要它们(非常好)时声明它们,所以无论如何都不必声明它们private
,因为它们已经对于创建它们的线程是私有的。因此,只需删除private
子句就可以解决您的问题。最后,如果性能对您很重要,而不是尝试并行化或向量化此代码,只需考虑通过有效的库调用替换它,它将为您完成。不幸的是,既然你正在处理整数,那么BLAS就不会这样做。但我确信那里有很好的选择。