【问题标题】:Access violation when calling cublas function调用 cublas 函数时访问冲突
【发布时间】:2012-09-11 20:51:40
【问题描述】:

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

【问题讨论】:

  • 我建议添加 cuda 错误检查。您可以在 google 上找到有关 cuda 错误检查的更多信息。这将帮助您查看代码哪里出错以及 cuda 错误是什么。
  • cudaError 错误 = cudaMalloc((void**)&dA, SIZE * sizef);看看它返回了什么。如果 cudaMalloc 没有错误,请检查您是否为函数提供了正确的参数。

标签: cuda cublas


【解决方案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 Documentation

编辑:

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

【讨论】:

  • 我尝试在调用 rotg 之前调用 cublasSetPointerMode(handle, CUBLAS_POINTER_MODE_DEVICE) 并修复了访问冲突异常,但现在它在 cublasGetVector 中失败并出现 CUBLAS_STATUS_MAPPING_ERROR。更糟糕的是,我检查了 cudaGetLastError 并返回“未知错误”
  • CUBLAS_STATUS_MAPPING_ERROR 的文档说“访问 GPU 内存空间失败,这通常是由于绑定纹理失败造成的。更正:在函数调用之前,取消绑定任何先前绑定的纹理。” -- 你在使用纹理吗?
  • 好的,我已经解决了。问题是我首先没有为's'参数正确调用cudaMalloc:/总而言之,我发布的代码的问题是:调用rotg时混合设备和主机参数,而不是设置cublas 指针模式适当。
猜你喜欢
  • 2014-03-19
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-07
相关资源
最近更新 更多