我正在使用在C ++ / OpenMP代码中实现的system,它在整个地方使用STL和Eigen的数据结构。从算法上讲,代码似乎是使用新的英特尔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程序员)的新手,所以我不完全理解“什么可以卸载?”的界限。
答案 0 :(得分:3)
您需要以下内容:
void __attribute__((target(mic))) computeIntensiveFunction(std::vector<sometype> myvar);
在您的来源中定义。这定义了MIC方面的功能,以便可以从卸载区域调用它。