Cuda 使用函数错误I don'访问设备向量构建的值;我不明白

Cuda 使用函数错误I don'访问设备向量构建的值;我不明白,cuda,thrust,Cuda,Thrust,我有一个奇怪的错误,当我使用函数初始化设备向量时,我不理解这个错误 我想创建一个大小为1000的设备_向量,包含以下元素: A[i]=i*0.05 下面是我的代码:(从这里的示例中看到:) #包括 #包括 #包括 使用命名空间推力::占位符; 内部主(空) { 推力:设备_矢量A( 推力::make_transform_迭代器( 推力:计数迭代器(0),_1*0.05), 推力::make_transform_迭代器( 推力:计数迭代器(0),_1*0.05)+1000); 当使用-G开关编译时

我有一个奇怪的错误,当我使用函数初始化设备向量时,我不理解这个错误

我想创建一个大小为1000的设备_向量,包含以下元素: A[i]=i*0.05

下面是我的代码:(从这里的示例中看到:)

#包括
#包括
#包括
使用命名空间推力::占位符;
内部主(空)
{
推力:设备_矢量A(
推力::make_transform_迭代器(
推力:计数迭代器(0),_1*0.05),
推力::make_transform_迭代器(
推力:计数迭代器(0),_1*0.05)+1000);

当使用
-G
开关编译时,std::cout推力程序通常不会正确运行,因此它是错误的

此特定行为可能因推力版本而异,并且随着时间的推移,新推力版本可能会有所改进。但一般来说,如果推力代码出现问题,请尝试在不使用
-G
开关的情况下编译


在没有
-G
开关的情况下编译设备代码通常会运行得更快,因此一般来说
-G
只能在您希望进行设备代码调试时使用(例如,使用Nsight VSE或cuda gdb),并且如果您特别关注设备代码生成的某些方面,您可能还希望使用
-G
进行测试。否则,您不应按照一般惯例使用
-G
编译代码。

您的代码在cuda 5.5(带推力v1.7)上编译并运行良好您是否使用适合您的GPU的
-arch=sm_20
或类似开关进行编译?您是否使用
-G
开关进行编译(即,如果在windows visual studio上,则使用调试项目)?你能在你的GPU上运行其他代码吗?谢谢你的回答。是的,我使用-G和arch开关。是的,我通常可以在我的GPU上编译和运行代码…我刚刚尝试使用了推力1.7,但仍然得到相同的运行时错误。我将尝试安装cuda 5.5(我还有5.0)。我希望这能解决它!在没有-G开关的情况下尝试它。这是可以的。它在没有-G开关的情况下工作,cuda 5.5和推力1.7,谢谢!希望我的代码在没有-G的情况下也能工作。我们会看到;-)谢谢。好吧,看起来我前几天说得太快了:确实没有-G标志,cuda 5.5,还有推力1.7代码编译并运行,但是,输出仍然不是我所期望的。下面是代码返回的结果:A[0]是-0,A[1]是-1.58819e-021,等等……与预期的A[I]相差甚远=i*0.05…这是从哪里来的?谢谢。你知道为什么推力与
-G
不兼容吗?不,我不知道。我所知道的关于这个问题的几乎都是链接页面上的内容。我听说,由于更多的测试,未来的CUDA版本可能/应该会有所改进。这意味着这只是bug需要解决,但那只是道听途说。
#include <thrust/device_vector.h>
#include <thrust/functional.h>  
#include <thrust/iterator/counting_iterator.h>
using namespace thrust::placeholders;

int main(void)
{
    thrust::device_vector<float> A(
        thrust::make_transform_iterator(
                thrust::counting_iterator<float>(0),_1*0.05),
        thrust::make_transform_iterator(
                thrust::counting_iterator<float>(0),_1*0.05) + 1000);

    std::cout << "--------------------------" << std::endl;
    std::cout << "A[0] is : " << A[0] << std::endl;
    std::cout << "A[1] is : " << A[1] << std::endl;
    std::cout << "A[100] is : " << A[100] << std::endl;
    std::cout << "A[500] is : " << A[500] << std::endl;

    return 0;
}