Ошибка разгрузки в MIC (Xeon Phi) итерация по загруженному массиву

У меня проблемы при выгрузке некоторых структур данных в мой MIC.

Я разгружаюсь в MIC со следующими директивами:

    #pragma offload target(mic:mic_no)\
    inout(is_selected : length(query_sequences_count)ALLOC)\
    in(a:length(a_size) ALLOC)\
    in(a_disp:length(offload_db_count)ALLOC)

Однако, если я пытаюсь выполнить внутри выгруженного региона:

//loads next 64 characters of a into datadb
__m512i datadb __attribute__ ((aligned(64)));
datadb = _mm512_load_epi32(a+iter_db+a_disp[j]);

Это вызывает следующую ошибку:

Offload error:process on the device 0 was terminated by signal 11(SIGSEGV)

Но если я вместо этого скопирую содержимое в другой массив, как это:

char db[64];
for(window_db_iter = 0; window_db_iter < 64; window_db_iter++)
    db[window_db_iter] = *(a+iter_db+a_disp[j]+window_db_iter);

//Now this works fine
datadb = _mm512_load_epi32(db);

Я проверил, что выгрузка с правильной длиной, a_size - это размер a, и что a_disp также корректен. Также a+iter_db+a_disp[j] остается всегда в пределах памяти. Я предполагаю, что это связано с процессом копирования памяти на MIC. Есть идеи?

Спасибо!

1 ответ

Решение

Через некоторое время я нашел ответ на свой вопрос.

  • Сначала структура данных должна быть выровнена. Если нет, он вернет ошибку. Ошибка Offload не означает, что ошибка возникла в процессе копирования памяти из центрального процессора в сопроцессор, она может быть вызвана в любом месте кода.

  • Во-вторых, если у вас есть невыровненная память и вы не можете / не хотите ее выравнивать, вы можете использовать модификатор выравнивания во время разгрузки следующим образом:

    #pragma offload target(mic:mic_no)\
    inout(is_selected : length(query_sequences_count)ALLOC)\
    in(a[0:a_size]: aligned(64) ALLOC)\
    in(a_disp:length(offload_db_count)ALLOC)
    

Теперь скопированная память будет скопирована выровнена.

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