Я использую компилятор Intel C++ 17.0.01, и у меня есть два блока кода.Перевод отладки Intel®pragma для OpenMP для Xeon Phi (проблемы с производительностью и другие вопросы)
Первый блок кода выделяет память на Xeon Phi, как это:
#pragma offload target(mic:1) nocopy(data[0:size]: alloc_if(1) free_if(0))
Второй блок оценивает выше память и копирует его обратно к хозяину:
#pragma offload target(mic:1) out(data[0:size]: alloc_if(0) free_if(0))
Этот код работает нормально но разгрузка #pragma является частью компилятора Intel (я думаю). Итак, я хочу преобразовать это в OpenMP.
Это, как я перевел первый блок в OpenMP:
#pragma omp target device(1) map(alloc:data[0:size])
И это, как я перевел второй блок в OpenMP:
#pragma omp target device(1) map(from:data[0:size])
Кроме того, я использовал export OFFLOAD_REPORT=2
для того, чтобы получить лучшая идея о том, что происходит во время работы.
Вот мои проблемы/вопросы:
- версия OpenMP первого блока кода является так же быстро, как версия Intel (
#pragma offload
). Здесь ничего странного. - Версия второго кода блока OpenMP в 5 раз медленнее, чем версия Intel. Тем не менее,
MIC_TIME
двух одинаковых, ноCPU_TIME
отличается (версия OpenMP намного выше). Почему это? - Является ли мои директивы Intel оптимальными?
- Является ли мой Intel -> OpenMP-перевод правильным и оптимальным?
А вот некоторые другие, немного по-другому, вопросы:
- На испытательной машине у меня есть две карты Intel Phi. Поскольку я хочу использовать второй, я делаю это:
#pragma omp target device(1)...
. Это верно? - Если я делаю
#pragma omp target device(5)...
код все еще работает! И он работает на одной из Phi-карт (а не на процессоре), потому что производительность похожа. Почему это? - Я также попробовал свое программное обеспечение (версия OpenMP) на машине без Xeon Phi, и он отлично работает на процессоре! Это гарантировано? Когда у вас нет ускорителя на машине,
target device(1)
игнорируется? - Возможно ли сделать что-то вроде
std::cout << print_phi_card_name_or_uid();
внутри загруженной области OpenMP (так что я точно знаю, в какой программе работает мое программное обеспечение)?