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
应该已经提出 先验 。
我正在尝试在 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
应该已经提出 先验 。