1

我对以下代码有疑问,在执行对 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);
...
4

1 回答 1

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 的前两个输入是输入/输出变量——它们的初始值被使用,但随后被覆盖。

由于它们被覆盖,奇怪的是你会将相同的指针传递给cublasSrot...

有关完整的详细信息,请参阅CUBLAS 文档

编辑:

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

于 2012-06-26T22:28:17.940 回答