В моем проекте CUDA я мог бы определить закрепленную память, скопировать данные из файла .txt в закрепленную память и использовать потоковую передачу для копирования данных в GPU при выполнении обработки в ядре. Теперь я хочу создать файл CUDA MEX и передать ему переменную данных (называемую RfData) в Matlab. Однако я заметил, что нет способа выделить массивы MATLAB напрямую в виде закрепленной памяти CUDA. Итак, я должен сделать это с выгружаемой памятью следующим образом:
int* RfData;
RfData = (int *)mxGetPr(prhs[0]);
int* Device_RfData;
int ArrayByteSize_RfData = sizeof(int) * (96* 96* 2048);
cudaMalloc((int**)&Device_RfData, ArrayByteSize_RfData);
cudaMemcpy(Device_RfData, RfData, ArrayByteSize_RfData, cudaMemcpyHostToDevice);
это важно для меня, чтобы скопировать асинхронность RfData с потоковой передачей. Единственный способ, который я мог придумать, - это сначала скопировать мои RfData в закрепленную память, а затем использовать потоковую передачу:
int* RfData_Pinned;
cudaHostAlloc((void**)&RfData_Pinned, ArrayByteSize_RfData, cudaHostAllocWriteCombined);
for (int j = 0; j < (96* 96* 2048); j++)
{
RfData_Pinned[j] = RfData[j];
}
Однако это увеличило общее время обработки моей функции MEX.
Итак, теперь возникает вопрос: как я могу асинхронно перенести свои данные из Matlab в GPU? Может быть, в CUDA есть команда, позволяющая быстро копировать данные из выгружаемой памяти в закрепленную!!!?
Заранее спасибо, Моэн.