У меня проблема с передачей данных с сопроцессора Intel Xeon Phi на центральный процессор. Я пытаюсь реализовать вычисления с использованием модели разгрузки. В начале моих вычислений я передаю все данные в сопроцессор (один массив). После вычисления я хочу передать на хост-процессор только часть этого массива, но в результате я получаю следующую ошибку:
ошибка разгрузки: передача данных (база = 0x75654640, размер = 7896016) не является подмножеством существующего выделения (база = 0x75654640, размер = 4512008)
Вот часть исходного кода:
array_Dc = _mm_malloc(...);
...
#pragma offload target(mic : micZero) \
in(array_Dc : length(size) alloc_if(0) free_if(0)) \
out(array[micBegin : micEnd] : alloc_if(0) free_if(0)
{
//...
}
В этом случае размер этого массива = 564001, micBegin = 423001, micEnd = 564001.
Мне нужно передать данные, потому что они используются процессором. В чем проблема? Как это решить?
Он жалуется, что вы пытаетесь передать часть массива, не сообщая ему, какой объем массива он должен разместить в сопроцессоре. Он хочет знать, хотите ли вы выделить только часть массива, который вы передаете, или вы хотите выделить большую часть, или даже весь массив. Есть пара вещей, которые вы можете сделать. Одним из них является использование опции alloc. В документации по компилятору 16.0 вы можете найти указания по адресу Выделение памяти для частей массивов. По сути, ваш вариант out стал бы — при условии, что вы хотите выделить место для всего массива на сопроцессоре:
#pragma offload ........... out(array[micBegin : micEnd] : alloc[0 : 564001])
Другой вариант — отделить распределение массива от передачи данных, например, с помощью offload_transfer. В документации по компилятору 16.0 вы можете найти указания по адресу Об асинхронной передаче данных.
И последнее: в C / C ++ значение micEnd будет количеством элементов, в отличие от Fortran, где это будет индекс последнего элемента. Как старый программист на Фортране, это заставило меня взяться за дело, но так оно и есть.
Других решений пока нет …