2

我正在使用一个用 C++/OpenMP 代码实现的系统,它到处使用 STL 和Eigen的数据结构。从算法上讲,该代码似乎是使用新的 Intel MIC ( Xeon Phi ) 卡进行加速的绝佳候选者。

代码中典型的并行循环如下所示:

#pragma omp parallel for private(i)
    for (i = 0; i < n; ++i) {
        computeIntensiveFunction(some_STL_or_eigen_container[i]);

上面的伪代码以合理的性能运行,但最好将其中的一部分卸载到 Xeon Phi 卡上。这是我这样做的尝试:

#pragma offload target (mic)    // <---- NEW
#pragma omp parallel for private(i)
    for (i = 0; i < n; ++i) {
        computeIntensiveFunction(some_STL_or_eigen_container[i]);

但是,英特尔 ICC/ICPC 编译器会吐出这样的错误:error: function "computeIntensiveFunction" called in offload region must have been declared with compatible "target" attribute.似乎这样的抱怨出现在涉及 STL 或Eigen的函数和数据结构上。


关于如何解决这个问题的任何想法?

我是使用 Xeon Phi(恢复 CUDA 程序员)的新手,所以我不完全理解“可以卸载什么?”的界限。

4

1 回答 1

3

你需要类似的东西:

void __attribute__((target(mic))) computeIntensiveFunction(std::vector<sometype> myvar);

在您的源代码中定义。这定义了 MIC 方面的函数,以便可以从卸载区域调用它。

于 2013-06-07T17:04:53.010 回答