使用带原始指针的推力函数:控制内存分配
Using Thrust Functions with raw pointers: Controlling the allocation of memory
我对使用 CUDA 时的推力库有疑问。
我正在使用推力函数,即 exclusive_scan,我想使用原始指针。我正在使用原始(设备)指针,因为我想完全控制何时分配和释放内存。
函数调用后,我会将指针移交给另一个数据结构,然后在该数据结构的析构函数中释放内存,或者在下一次函数调用中重新计算我的(设备)指针时释放内存。我遇到了例如 this problem here now,它建议将数据结构包装在 device_vector 中。但是后来我 运行 遇到了一个问题,即一旦我的 device_vector 超出范围,内存就会被释放,这是我不想要的。全局拥有设备指针也不是一种选择,因为我正在破解代码,即它被用作缓冲区,如果我想做这样的事情,我将不得不重写很多东西。
有人对此有好的解决方法吗?我现在看到的唯一机会是自己重写推力函数,只使用原始设备指针。
编辑:我看错了,我可以将它包装在 device_ptr 而不是 device_vector 中。
不过,如果没有使用 device_ptr 的选项,我该如何解决这个问题?
在推力方法中使用普通指针没有问题。
对于设备上的数据执行:
....
struct DoSomething {
__device__ int operator()(int item) { return 1; }
};
int* IntData;
cudaMalloc(&IntData, sizeof(int) * count);
auto dev_data = device_pointer_cast(IntData);
thrust::generate(dev_data, dev_data + count, DoSomething());
thrust::sort(dev_data, dev_data + count);
....
cudaFree(IntData);
对于主机上的数据,使用纯 malloc/free
和 raw_pointer_cast
而不是 device_pointer_cast
。
参见:thrust: Memory management
我对使用 CUDA 时的推力库有疑问。 我正在使用推力函数,即 exclusive_scan,我想使用原始指针。我正在使用原始(设备)指针,因为我想完全控制何时分配和释放内存。
函数调用后,我会将指针移交给另一个数据结构,然后在该数据结构的析构函数中释放内存,或者在下一次函数调用中重新计算我的(设备)指针时释放内存。我遇到了例如 this problem here now,它建议将数据结构包装在 device_vector 中。但是后来我 运行 遇到了一个问题,即一旦我的 device_vector 超出范围,内存就会被释放,这是我不想要的。全局拥有设备指针也不是一种选择,因为我正在破解代码,即它被用作缓冲区,如果我想做这样的事情,我将不得不重写很多东西。
有人对此有好的解决方法吗?我现在看到的唯一机会是自己重写推力函数,只使用原始设备指针。
编辑:我看错了,我可以将它包装在 device_ptr 而不是 device_vector 中。 不过,如果没有使用 device_ptr 的选项,我该如何解决这个问题?
在推力方法中使用普通指针没有问题。
对于设备上的数据执行:
....
struct DoSomething {
__device__ int operator()(int item) { return 1; }
};
int* IntData;
cudaMalloc(&IntData, sizeof(int) * count);
auto dev_data = device_pointer_cast(IntData);
thrust::generate(dev_data, dev_data + count, DoSomething());
thrust::sort(dev_data, dev_data + count);
....
cudaFree(IntData);
对于主机上的数据,使用纯 malloc/free
和 raw_pointer_cast
而不是 device_pointer_cast
。
参见:thrust: Memory management