cuda 推力:检查 NULL 指针

cuda thrust: checking for NULL pointers

我正在尝试在 CUDA 中使用 thrust,结果如下:

data = thrust::device_malloc<float>(N);

现在,我有另一种方法可以检查数据指针是否正确初始化。这是正确的用法还是有更好的方法?

if (data->get() == NULL) // throw some exception.

我很惊讶我不能直接在 device_ptr 对象上使用 bool 比较器,例如:

if (!data) // compilation error.

此外,如果我想使用 thrust::device_free,我是否需要再次检查 NULL(就像在 C 风格中一样)或者对 NULL 输入指针使用 thrust::device_free 是否安全?

如果分配失败,

thrust::device_malloc 会引发异常,所以我真的没有想到需要检查 device_ptr 的值是否有效或抛出异常的情况用户代码中的异常。在每种情况下,代码都应该因未捕获的异常而中止,或者您的主机捕获由 thrust 引发的异常并做出相应的反应。

也就是说,thrust::device_malloc 的来源表明,在内存分配失败的情况下,返回的 device_ptr 将保存原始指针值 0。您应该能够通过以下方式确认这一点以下:

#include <thrust/device_malloc.h>
#include <thrust/device_ptr.h>
#include <iostream>
#include <new>

void try_alloc(unsigned int N)
{
    thrust::device_ptr<float> data;

    std::cout << "trying N=" << N;

    try
    {
        data = thrust::device_malloc<float>(N);
    }
    catch (std::bad_alloc& e)
    {
        std::cerr << " bad_alloc caught: " << e.what() << std::endl;
    }
    std::cout << " data.get() returns: " << std::hex << data.get() << std::endl;

}

int main()
{

    try_alloc(2<<4);
    try_alloc(2<<9);
    try_alloc(2<<14);
    try_alloc(2<<19);
    try_alloc(2<<24);
    try_alloc(2<<29);

    return 0;
}

所以为了

回答你的问题
data = thrust::device_malloc<float>(N); 

一个"correct"测试将是

if (!data.get()) { .. } // Pointer is invalid 

注意到 std::bad_alloc 应该已经提出 先验