Ошибка разгрузки в 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)
Теперь скопированная память будет скопирована выровнена.