c++ - 英特尔 MIC 卸载——它如何与 STL 配合使用?

标签 c++ stl eigen icc intel-mic

我正在使用 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/

相关文章:

C++ Boost::MPL fold 示例 - 参数数量错误

c++ - 下标字符串文字

c++ - 如何更新某些子集的排名?

C++多写点流

c++ - 具有 std::variant 和 std::visit 的 union 模板

c++ - 如何将对象从 D 传递到 C++?

c++ - 初始化一个线程,它是构造函数内部的成员变量

c++ - 如何优化字符串复制(内存分配)?

c++ - 在 Qiana 上构建 opencv 失败

c++ - 如何在 MPI + openmp 中启动多线程?