Cuda 无法创建推力设备矢量

Cuda 无法创建推力设备矢量,cuda,thrust,Cuda,Thrust,因此,我试图开始GPU编程,并使用推力库来简化事情。 我已经创建了一个测试程序来处理它,并查看它是如何工作的,但是每当我试图创建一个大小非零的推力::设备#向量时,程序就会崩溃,“运行时检查失败#3-变量‘result’未经初始化就被使用。”(这来自分配器_traits.inl文件)并且……我不知道如何修复这个问题。 以下是导致此错误所需的全部内容 #include <thrust/device_vector.h> int main() { int N = 100;

因此,我试图开始GPU编程,并使用推力库来简化事情。 我已经创建了一个测试程序来处理它,并查看它是如何工作的,但是每当我试图创建一个大小非零的推力::设备#向量时,程序就会崩溃,“运行时检查失败#3-变量‘result’未经初始化就被使用。”(这来自分配器_traits.inl文件)并且……我不知道如何修复这个问题。 以下是导致此错误所需的全部内容

#include <thrust/device_vector.h>

int main()
{
    int N = 100;
    thrust::device_vector<int> d_a(N);
    return 0;
}
#包括
int main()
{
int N=100;
推力:装置矢量d(N);
返回0;
}
我怀疑这可能是一个如何设置环境的问题,所以关于这方面的详细信息。。。
使用visual studio 2019在CUDA 11.0运行时项目(打开此项目时给出的示例程序运行良好)中创建,推力版本1.9,给定的GPU是GTX 970。

此问题似乎仅在与CUDA 11.0相关的推力版本(1.9.x)中出现,并且仅在windows/visual studio上的调试项目中出现

一些解决方法是切换到构建发布项目,或者在运行时出现的对话框上单击“忽略”。根据我的测试,这允许在该点进行普通运行或调试


我还没有确认,但我相信这个问题在刚刚发布的最新版本(1.10.x)中已经得到了解决(虽然目前不是任何正式的CUDA版本的一部分,但我希望它会成为未来CUDA版本的一部分).

根据Robert Crovella的回答,我用GitHub中的代码更改了推力库中相应的代码行,从而解决了这个问题。更准确地说,在文件…\CUDA\v11.1\include\推力\detail\allocator\allocator\u traits.inl中,我替换了以下函数

template<typename Alloc>
__host__ __device__
  typename disable_if<
    has_member_system<Alloc>::value,
    typename allocator_system<Alloc>::type
  >::type
    system(Alloc &)
{
  // return a copy of a default-constructed system
  typename allocator_system<Alloc>::type result;
  return result;
}
模板
__主机设备__
typename禁用\u如果<
具有成员系统::值,
typename分配器\u系统::类型
>::类型
系统(Alloc&)
{
//返回默认构造系统的副本
typename分配器\ U系统::类型结果;
返回结果;
}

模板
__主机设备__
typename禁用\u如果<
具有成员系统::值,
typename分配器\u系统::类型
>::类型
系统(Alloc&)
{
//返回默认构造系统的副本
返回typename分配器_system::type();
}

如果您更改为
{推力::设备向量d_a(N);}
是否正在构建调试项目?尝试切换到发布项目。如果这对您来说是个问题,我建议您使用说明在developer.nvidia.com上提交一个bug。FWIW,作为一个简单的测试,我可以单击“忽略”,然后运行/调试CUDA程序。您还可以在执行结束时获得一个对话框,您也可以单击“忽略”。这似乎只在调试项目中出现。(也许只有CUDA11,我无法用CUDA10.1重现这个问题)切换到发行版或忽略弹出窗口起作用。我不希望程序在以后继续正常运行,但考虑到它被指定为调试错误,这有点道理。非常感谢你!
template<typename Alloc>
__host__ __device__
  typename disable_if<
    has_member_system<Alloc>::value,
    typename allocator_system<Alloc>::type
  >::type
    system(Alloc &)
{
  // return a copy of a default-constructed system
  return typename allocator_system<Alloc>::type();
}