调用cublas函数时访问冲突

时间:2012-06-26 00:58:30

标签: cuda cublas

我遇到以下代码的问题,当执行对cublasSrotg的调用时,它会引发异常:“访问冲突写入位置0x05200600”,这是“dA”指针的地址。当运行调试器时,它似乎正在跳过对cudaMalloc的调用,但我无法弄清楚我做错了什么。

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);
...

1 个答案:

答案 0 :(得分:1)

从以下代码行中我收集SIZE等于4

float hA[SIZE] = { 1.0f, 2.0f, 3.0f, 4.0f };

然而在这里,你做了两件奇怪的事情:

cublasSrotg(handle, dA, dA + N, &c, &s);
  1. 您将主机和设备参数混合到相同的cublas函数(我不知道这是否合法)。 dA是设备指针,sc是主变量。

  2. 您通过了dAdA + N。除非N小于4,否则您将编入索引越界,因此这可能是您的问题。另请注意,cublasSrotg的前两个输入是输入/输出变量 - 使用它们的初始值,但随后被覆盖。

  3. 因为它们被覆盖了,所以你会将相同的指针传递给cublasSrot ......这很奇怪...

    有关详细信息,请参阅CUBLAS Documentation

    修改

    OP显示问题在于混合设备和主机指针,以及不调用cudaMalloc在设备上分配cs值。