Cuda 调用cublas函数时发生访问冲突

Cuda 调用cublas函数时发生访问冲突,cuda,cublas,Cuda,Cublas,我对下面的代码有一个问题,当执行对CubrassRotg的调用时,它抛出一个异常:“访问冲突写入位置0x05200600”,这是“dA”指针的地址。运行调试器时,它似乎跳过了对Cudamaloc的调用,但我无法找出我做错了什么 cublasHandle_t handle; cublasCreate(&handle); float hA[SIZE] = { 1.0f, 2.0f, 3.0f, 4.0f }; int sizef = sizeof(float); float* dA; cud

我对下面的代码有一个问题,当执行对CubrassRotg的调用时,它抛出一个异常:“访问冲突写入位置0x05200600”,这是“dA”指针的地址。运行调试器时,它似乎跳过了对Cudamaloc的调用,但我无法找出我做错了什么

cublasHandle_t handle;
cublasCreate(&handle);
float hA[SIZE] = { 1.0f, 2.0f, 3.0f, 4.0f };
int sizef = sizeof(float);
float* dA;
cudaMalloc((void**)&dA, SIZE * sizef);
cublasSetVector(SIZE, sizef, hA, 1, dA, 1);
float s, c;
cublasSrotg(handle, dA, dA + N, &c, &s);
cublasSrot(handle, N, dA, 1, dA + N, 1, &c, &s);
cublasGetVector(SIZE, sizef, dA, 1, hA, 1);
...

从下面的代码行中,我得出
SIZE
等于
4

float hA[SIZE] = { 1.0f, 2.0f, 3.0f, 4.0f };
但在这里,你做了两件奇怪的事:

cublasSrotg(handle, dA, dA + N, &c, &s);
  • 您将主机和设备参数混合到同一个cublas函数中(我不知道这是否合法)
    dA
    是一个设备指针,
    s
    c
    是主机变量

  • 您通过
    dA
    dA+N
    。除非
    N
    小于
    4
    ,否则索引将超出范围,因此这可能是您的问题。另外,请注意,CubrassRotg的前两个输入是in/out变量——它们的初始值被使用,但随后被覆盖

  • 因为它们被覆盖了,所以奇怪的是,您会将相同的指针传递给
    cublasSrot

    有关详细信息,请参阅

    编辑:


    OP发现问题在于混合了设备和主机指针,以及没有调用cudaMalloc来分配设备上的
    c
    s
    值。

    从下面的代码行中,我收集到
    SIZE
    等于
    4

    float hA[SIZE] = { 1.0f, 2.0f, 3.0f, 4.0f };
    
    但在这里,你做了两件奇怪的事:

    cublasSrotg(handle, dA, dA + N, &c, &s);
    
  • 您将主机和设备参数混合到同一个cublas函数中(我不知道这是否合法)
    dA
    是一个设备指针,
    s
    c
    是主机变量

  • 您通过
    dA
    dA+N
    。除非
    N
    小于
    4
    ,否则索引将超出范围,因此这可能是您的问题。另外,请注意,CubrassRotg的前两个输入是in/out变量——它们的初始值被使用,但随后被覆盖

  • 因为它们被覆盖了,所以奇怪的是,您会将相同的指针传递给
    cublasSrot

    有关详细信息,请参阅

    编辑:


    OP发现问题在于混合了设备和主机指针,以及没有调用cudaMalloc来分配设备上的
    c
    s
    值。

    我建议添加cuda错误检查。你可以在谷歌上找到更多关于cuda错误检查的信息。这将帮助您查看代码哪里出错以及cuda错误是什么。cudaError error=cudamaloc((void**)&dA,SIZE*sizef);看看它会返回什么。如果cudaMalloc中没有错误,那么请检查您是否为函数提供了正确的参数。我建议添加cuda错误检查。你可以在谷歌上找到更多关于cuda错误检查的信息。这将帮助您查看代码哪里出错以及cuda错误是什么。cudaError error=cudamaloc((void**)&dA,SIZE*sizef);看看它会返回什么。如果cudaMalloc中没有错误,那么请检查您是否为函数提供了正确的参数。在调用rotg(并且只传递设备指针)之前,我尝试调用cublasSetPointerMode(句柄,Cublass\u指针\u模式\u设备),这修复了访问冲突异常,但现在它在cublasGetVector中失败,出现了CUBLAS_STATUS_MAPPING_错误。更糟糕的是,我使用cudaGetLastError进行了检查,它返回了“未知错误”。CUBLAS_STATUS_MAPPING_错误的文档中说,“访问GPU内存空间失败,这通常是由于绑定纹理失败造成的。要更正:在函数调用之前,取消绑定任何以前绑定的纹理。”--你在使用纹理吗?好的,我已经解决了。问题是,我没有正确地调用cudamaloc以获取“s”参数:/总而言之,我发布的代码的问题是:在调用rotg时混合了设备和主机参数,并且没有正确地设置cublassetpointer模式。我尝试调用cublasSetPointerMode(handle,cublass\u pointer\u mode\u device)在调用rotg(并且只传递设备指针)之前,它修复了访问冲突异常,但现在它在cublasGetVector中失败,出现CUBLAS_STATUS_MAPPING_错误。更糟糕的是,我使用cudaGetLastError进行了检查,它返回了“未知错误”。CUBLAS_STATUS_MAPPING_错误的文档中说,“访问GPU内存空间失败,这通常是由于绑定纹理失败造成的。要更正:在函数调用之前,取消绑定任何以前绑定的纹理。”--你在使用纹理吗?好的,我已经解决了。问题是,我没有正确地调用cudamaloc以获取“s”参数:/总而言之,我发布的代码的问题是:在调用rotg时混合了设备和主机参数,并且没有正确地设置cublas指针模式。