Я использую API драйвера CUDA. Упрощенное описание проблемы выглядит следующим образом:
// файл .cu, скомпилировать в файл ptx.
extern "C" __global__ void SomeFunction(char* d_buffer) {
float* p = malloc(sizeof(float) * 100); // Allocate memory per thread
do some calculation with allocated memory. // About 5x10^5 threads.
do some other calculation with d_buffer.
free(p)
}
//. cpp file
int main()
{ // Allocate device buffer
CUdeviceptr d_buffer;
cuMemAlloc(&d_buffer, bytes);
// Allocate host buffer
char* h_buffer = new char(bytes);
// copy host buffer to device buffer
cuMemcpyHtoD(h_buffer, d_buffer, bytes);
CUfunction func;
cuModuleGetFunction(&func, module, "SomeFunction");
cuLaunchKernel(func, grid_dims,...,block_dims,...,args,...);
// copy device buffer to host buffer
cuMemcpyDtoH(d_buffer, h_buffer, bytes); // Failed!
}
Проблема заключается в операции копирования в последней строке файла. cpp FAILED. Однако, если я закомментировал выделение динамического c (mallo c, бесплатно) в файле .cu, операция копирования будет УСПЕШНОЙ. Мой вопрос в том, есть ли какие-либо ограничения на использование динамического c выделения в API драйвера? Если да, то что это? Как правильно использовать динамическое выделение c в API драйвера?