Разгрузка Intel MIC - как это работает с STL?

Я работаю с системой, которая реализована в коде 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]);

Однако компилятор Intel ICC/ICPC выдает такую ​​ошибку: error: function "computeIntensiveFunction" called in offload region must have been declared with compatible "target" attribute. Кажется, что подобные жалобы появляются для функций и структур данных, которые включают STL или Eigen.


Есть мысли о том, как обойти это?

Я новичок в использовании Xeon Phi (восстановление программиста CUDA), так что я не совсем понимаю границы "что можно выгружать?"

1 ответ

Вам нужно что-то вроде:

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

определено в вашем источнике. Это определяет функцию на стороне MIC, чтобы ее можно было вызывать из области разгрузки.

Другие вопросы по тегам