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

Я работаю с система это реализовано в коде C ++ / OpenMP, и он использует STL и собственныйструктуры данных повсюду. Алгоритмически, код кажется отличным кандидатом на ускорение с новым 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 или собственный.


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

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

2

Решение

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

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

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]