Я работаю с система это реализовано в коде 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), поэтому я не совсем понимаю границы «что можно выгружать?»
Вам нужно что-то вроде:
void __attribute__((target(mic))) computeIntensiveFunction(std::vector<sometype> myvar);
определено в вашем источнике. Это определяет функцию на стороне MIC, так что ее можно вызывать из области разгрузки.
Других решений пока нет …