Разгрузка 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, чтобы ее можно было вызывать из области разгрузки.