Memory CUDA cudaMemcpy:参数无效

Memory CUDA cudaMemcpy:参数无效,memory,cuda,invalid-argument,Memory,Cuda,Invalid Argument,这是我的密码: struct S { int a, b; float c, d; }; class A { private: S* d; S h[3]; public: A() { cutilSafeCall(cudaMalloc((void**)&d, sizeof(S)*3)); } void Init(); }; void A::Init() { for (int i=0;i<3;i++) {

这是我的密码:

struct S {
    int a, b;
    float c, d;
};
class A {
private:
    S* d;
    S h[3];
public:
    A() {
        cutilSafeCall(cudaMalloc((void**)&d, sizeof(S)*3));
    }
void Init();
};

void A::Init() {
    for (int i=0;i<3;i++) {
        h[i].a = 0;
        h[i].b = 1;
        h[i].c = 2;
        h[i].d = 3;
    }
    cutilSafeCall(cudaMemcpy(d, h, 3*sizeof(S), cudaMemcpyHostToDevice));
}

A a;
结构{
INTA,b;
浮点数c,d;
};
甲级{
私人:
S*d;
sh[3];
公众:
(){
表皮安全壳(Cudamaloc((void**)和d,尺寸*3);
}
void Init();
};
void A::Init(){

对于(int i=0;i,因为CUDA中的内存操作是阻塞的,所以它们构成了一个同步点。因此,如果不使用cudaThreadSynchonize检查其他错误,则看起来像是内存调用中的错误

因此,如果在内存操作中收到错误,请尝试将cudaThreadSynchronize放在它前面并检查结果


确保正在执行第一个malloc语句。如果是CUDA初始化问题,如@Harrism indicate,则该语句将失败??尝试放置printf语句,并查看是否执行了正确的初始化。我认为,由于使用非斜体内存区域,通常会生成无效的参数错误美国

  • 写一个printf到你的构造器,显示cudaMalloc'ed内存区域的地址

    A()
    {
        d = NULL;
        cutilSafeCall(cudaMalloc((void**)&d, sizeof(S)*3));
        printf("D: %p\n", d);
    }
    
  • 尝试为本地分配的区域创建内存拷贝,即将cudaMalloc移动到cudaMemcopy的上方(仅用于测试)

    void A::Init()
    {
    
    对于(int i=0;顺便说一句,cudaMemcpy将返回cudaErrorInvalidValue。行
    A;
    )在哪里?它是在函数内部还是全局的?如果它是全局的,那么在您拥有有效的设备上下文之前可能会调用构造函数(我不确定这一点,但这是可能的)。如果是这种情况,则传递给cudaMemcpy的d指针将无效。请发布您使用的CUDA配置,好吗?我无法用旧的GeForce 9400m和CUDA 5.0预览重现您的错误。
    void A::Init()
    {
        for (int i=0;i<3;i++)
        {
            h[i].a = 0;
            h[i].b = 1;
            h[i].c = 2;
            h[i].d = 3;
        }
        cutilSafeCall(cudaMalloc((void**)&d, sizeof(S)*3)); // here!..
        cutilSafeCall(cudaMemcpy(d, h, 3*sizeof(S), cudaMemcpyHostToDevice));
    }