我正在使用 system它是用 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 编译器会抛出如下错误:错误:在卸载区域中调用的函数“computeIntentialFunction”必须已使用兼容的“目标”属性进行声明。
似乎是提示对于涉及 STL 或 Eigen 的函数和数据结构,会出现这样的情况.
关于如何解决这个问题有什么想法吗?
我刚开始使用 Xeon Phi(恢复 CUDA 程序员),所以我不完全理解“可以卸载什么?”的界限。
最佳答案
你需要这样的东西:
void __attribute__((target(mic))) computeIntensiveFunction(std::vector<sometype> myvar);
在您的源代码中定义。这定义了 MIC 端的函数,以便可以从卸载区域调用它。
关于c++ - 英特尔 MIC 卸载——它如何与 STL 配合使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15727670/