OpenMP出错,尝试对矩阵乘法进行矢量化循环

时间:2018-03-14 01:06:03

标签: c openmp matrix-multiplication

我试图对我制作的旧矩阵乘法程序进行矢量化,特别是这个函数在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;
        }
    }
}

1 个答案:

答案 0 :(得分:2)

这里有两件值得一提的事情:

  1. 你在这里实际做的不是矢量化(尽管你的编译器可能正在为你做),它是并行化的。在这里,你要创建线程来分割工作。每个线程可能会也可能不会使用CPU的向量单元来进行更多的计算,但它与您放置的并行化指令无关。
  2. 编译器报告的错误只表示它不知道您在private指令中列出的变量。实际上,如果您仔细观察,ijksum都不会在指令行之前声明。所以对于编译器来说,它们还不存在。事实上,由于你只需要在parallel区域内需要它们(非常好)时声明它们,所以无论如何都不必声明它们private,因为它们已经对于创建它们的线程是私有的。因此,只需删除private子句就可以解决您的问题。
  3. 最后,如果性能对您很重要,而不是尝试并行化或向量化此代码,只需考虑通过有效的库调用替换它,它将为您完成。不幸的是,既然你正在处理整数,那么BLAS就不会这样做。但我确信那里有很好的选择。