我正在使用一个用 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 程序员)的新手,所以我不完全理解“可以卸载什么?”的界限。