memory - CUDA cudaMemcpy : 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++) {
        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;

事实上,它是一个包含 CUDA 和 OpenGL 的复杂程序。当我调试这个程序时,它在 cudaMemcpy 上运行时失败并显示错误信息

cudaSafeCall() Runtime API error 11: invalid argument.



实际上,这个程序是由另一个可以正确运行的程序转换而来的。但是在那一个中​​,我在主函数中而不是在类中使用了两个变量 S* d 和 S h[3]。更奇怪的是,我在一个小程序中实现了这个A类,它运行良好。
而且我已经更新了我的驱动程序,错误仍然存​​在。

谁能给我一个关于为什么会发生这种情况以及如何解决它的提示。谢谢。

最佳答案

因为 CUDA 中的内存操作是阻塞的,所以它们形成了一个同步点。因此,如果不使用 cudaThreadSynconize 检查其他错误,则看起来像是内存调用错误。

因此,如果在内存操作中收到错误,请尝试在它之前放置一个 cudaThreadSynchronize 并检查结果。

确保第一个 malloc 语句正在执行。如果是 CUDA 初始化的问题,如@Harrism 指出的,那么它会在这个语句中失败??尝试放置 printf 语句,并查看是否执行了正确的初始化。我认为通常会因为使用未初始化的内存区域而产生无效参数错误。

  • 将 printf 写入构造函数,显示 cudaMalloc 的内存区域的地址
    A()
    {
        d = NULL;
        cutilSafeCall(cudaMalloc((void**)&d, sizeof(S)*3));
        printf("D: %p\n", d);
    }
    
  • 尝试为本地分配的区域制作内存副本,即将 cudaMalloc 移动到 cudaMemcopy 的上方(仅用于测试)。
    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));
    }
    

  • 祝你好运。

    关于memory - CUDA cudaMemcpy : invalid argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10579624/

    相关文章:

    java - 关于对 ArrayList 元素的引用的简单 Java 问题

    iphone - 应用程序因内存使用率非常低而崩溃 iphone/iPad

    python - 将所有组合存储在列表中时如何避免内存错误

    c - GPU(CUDA)和CPU计算结果不同

    c++ - 一元 '*' 的无效类型参数(具有 'int' )数组中的最低元素

    c - mmap 中的无效参数

    Perl IO::Socket::INET 混淆 "Invalid argument"错误

    c# - Visual Studio 2005 搜索内存

    cuda - 确定 CUDA 中 #pragma unroll N 的最佳值

    cuda - 有没有办法为共享内存数组设置默认值?