【问题标题】:Using Thrust Functions with raw pointers: Controlling the allocation of memory使用原始指针的推力函数:控制内存分配
【发布时间】:2020-04-03 12:16:18
【问题描述】:

我对使用 CUDA 时的推力库有疑问。 我正在使用推力函数,即exclusive_scan,并且我想使用原始指针。我正在使用原始(设备)指针,因为我想完全控制何时分配和释放内存。

在函数调用之后,我将把指针交给另一个数据结构,然后在我重新计算我的(设备)指针时,在这个数据结构的析构函数中或在下一个函数调用中释放内存。例如,我遇到了this problem here now,它建议将数据结构包装在 device_vector 中。但是后来我遇到了一个问题,即一旦我的 device_vector 超出范围,内存就会被释放,这是我不想要的。全局拥有设备指针也不是一种选择,因为我正在破解代码,即它被用作缓冲区,如果我想做类似的事情,我将不得不重写很多。

有人对此有很好的解决方法吗?我现在看到的唯一机会是自己重写推力函数,只使用原始设备指针。

编辑:我看错了,我可以将它包装在 device_ptr 而不是 device_vector 中。 不过进一步询问,如果没有使用 device_ptr 的选项,我该如何解决这个问题?

【问题讨论】:

  • 您链接到的问题建议使用 device_ptr,而不是 device_vector
  • 啊,你是对的。我确实监督了这个细节,谢谢。这给我留下了一个问题,但是如果我没有这个选项,我该如何进行内存管理。我应该为此提出一个新问题吗?
  • 使用 API 的调度策略版本,我猜

标签: memory-management cuda thrust


【解决方案1】:

在推力方法中使用普通指针没有问题。

对于设备上的数据,请执行以下操作:

....
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/freeraw_pointer_cast 而不是 device_pointer_cast。 见:thrust: Memory management

【讨论】:

  • 技术上不使用纯指针。普通指针支持将涉及推力 API 的调度策略版本
猜你喜欢
  • 2017-12-13
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 2012-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多