Dynamic 设备中的动态分配导致内存复制失败
我正在使用CUDA驱动程序API。简化的问题描述如下所示: //.cu文件,编译为ptx文件Dynamic 设备中的动态分配导致内存复制失败,dynamic,cuda,allocation,memcpy,Dynamic,Cuda,Allocation,Memcpy,我正在使用CUDA驱动程序API。简化的问题描述如下所示: //.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.
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文件
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文件最后一行中的复制操作失败。但是,如果我在.cu文件中注释掉了动态分配(malloc,free),那么复制操作将成功。我的问题是,在驱动程序API中使用动态分配是否有任何限制?如果是,这些是什么?如何在驱动程序API中正确使用动态分配
我的问题是,在驱动程序API中使用动态分配是否有任何限制
不超过运行时API中的值
如何在驱动程序API中正确使用动态分配
需要认识到的重要一点是,内核之后的复制失败,因为内核本身在运行时出错
如中所述,运行时内核分配来自固定大小的堆,默认为8Mb。如果耗尽该堆,内核中的malloc
调用将失败,调用将返回NULL
。这是您可以测试的条件。我猜你不会,然后你的“使用分配的内存进行一些计算”会取消对空指针的引用,并导致崩溃
要在驱动程序API中纠正这一点,您需要使用CU_LIMIT\u MALLOC\u HEAP_SIZE
参数调用,并将堆大小设置为更真实的大小(考虑设备上驻留线程的最大数量x每个线程的字节数,四舍五入到最接近的16字节页面对齐方式,再加上安全裕度)。如果你这样做,事情可能会开始工作
我的问题是,在驱动程序API中使用动态分配是否有任何限制
不超过运行时API中的值
如何在驱动程序API中正确使用动态分配
需要认识到的重要一点是,内核之后的复制失败,因为内核本身在运行时出错
如中所述,运行时内核分配来自固定大小的堆,默认为8Mb。如果耗尽该堆,内核中的malloc
调用将失败,调用将返回NULL
。这是您可以测试的条件。我猜你不会,然后你的“使用分配的内存进行一些计算”会取消对空指针的引用,并导致崩溃
要在驱动程序API中纠正这一点,您需要使用CU_LIMIT\u MALLOC\u HEAP_SIZE
参数调用,并将堆大小设置为更真实的大小(考虑设备上驻留线程的最大数量x每个线程的字节数,四舍五入到最接近的16字节页面对齐方式,再加上安全裕度)。如果你这样做,事情可能会开始工作