我遇到以下代码的问题,当执行对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);
...
答案 0 :(得分: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
,否则您将编入索引越界,因此这可能是您的问题。另请注意,cublasSrotg的前两个输入是输入/输出变量 - 使用它们的初始值,但随后被覆盖。
因为它们被覆盖了,所以你会将相同的指针传递给cublasSrot
......这很奇怪...
有关详细信息,请参阅CUBLAS Documentation。
修改强>
OP显示问题在于混合设备和主机指针,以及不调用cudaMalloc在设备上分配c
和s
值。