cublas 地址超出特定矩阵大小的范围
cublas address out of bounds for particular matrix size
当我运行下面的代码计算矩阵乘法y = X * B:
#include <iostream>
#include <Eigen/Dense>
#include <cuda_runtime.h>
#include "cublas_v2.h"
using namespace Eigen;
int main(){
int N = 240000;
int K = 3;
int p = 9700;
MatrixXf X_host = MatrixXf::Zero(N, p);
MatrixXf B_host = MatrixXf::Zero(p, K);
MatrixXf y_host(N, K);
float *X_dev;
float *B_dev;
float *y_dev;
cudaMalloc((void**)&X_dev, sizeof(float) * p * N);
cudaMalloc((void**)&B_dev, sizeof(float) * p * K);
cudaMalloc((void**)&y_dev, sizeof(float) * N * K);
cudaMemcpy(X_dev, X_host.data(), sizeof(float)*p*N, cudaMemcpyHostToDevice);
cudaMemcpy(B_dev, B_host.data(), sizeof(float)*p*K, cudaMemcpyHostToDevice);
cublasHandle_t handle;
cublasCreate(&handle);
cudaError_t error = cudaGetLastError();
if(error != cudaSuccess)
{
std::cout << "CUDA error: " << cudaGetErrorString(error) << std::endl;
} else {
std::cout << "No problem before cublas call\n";
}
float alpha = 1.0;
float beta = 0.0;
cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N,
N, K, p, &alpha,
X_dev, N, B_dev, p, &beta, y_dev, N);
cudaDeviceSynchronize();
error = cudaGetLastError();
if(error != cudaSuccess)
{
std::cout << "CUDA error: " << cudaGetErrorString(error) << std::endl;
}
cublasDestroy(handle);
cudaFree(X_dev);
cudaFree(B_dev);
cudaFree(y_dev);
return 0;
}
我从 cuda-memcheck
得到这个错误:
========= Invalid __global__ read of size 4
========= at 0x00000a88 in void gemmSN_NN_kernel<float, int=256, int=4, int=2, int=8, int=4, int=4, cublasGemvTensorStridedBatched<float const >, cublasGemvTensorStridedBatched<float>>(cublasGemmSmallNParams<float const , cublasGemvTensorStridedBatched<float const >, float>)
========= by thread (223,0,0) in block (190,0,0)
========= Address 0x2b660269807c is out of bounds
大约有 100 个这样的地址越界错误,它们的数量在 运行 之间变化。当我将 K 设置为更大的数字(例如 10)时,问题就消失了。任何人都知道会发生什么?我在 CentOS 7 上使用 CUDA 10.1、P100。谢谢!
2020 年 9 月 21 日更新:
这个问题在我更新到 CUDA 11 后就没有了。
如评论中所述,这似乎是 CUBLAS 库中的一个内部问题。我会社论并猜测他们没有针对这种具有如此小的内部产品尺寸的异常尺寸问题的测试覆盖率,并且该错误通过了未检测到的预发布测试。
与可能的错误一样,您最好将问题中的代码作为 NVIDIA developer portal 票据上的重现案例提交。
当我运行下面的代码计算矩阵乘法y = X * B:
#include <iostream>
#include <Eigen/Dense>
#include <cuda_runtime.h>
#include "cublas_v2.h"
using namespace Eigen;
int main(){
int N = 240000;
int K = 3;
int p = 9700;
MatrixXf X_host = MatrixXf::Zero(N, p);
MatrixXf B_host = MatrixXf::Zero(p, K);
MatrixXf y_host(N, K);
float *X_dev;
float *B_dev;
float *y_dev;
cudaMalloc((void**)&X_dev, sizeof(float) * p * N);
cudaMalloc((void**)&B_dev, sizeof(float) * p * K);
cudaMalloc((void**)&y_dev, sizeof(float) * N * K);
cudaMemcpy(X_dev, X_host.data(), sizeof(float)*p*N, cudaMemcpyHostToDevice);
cudaMemcpy(B_dev, B_host.data(), sizeof(float)*p*K, cudaMemcpyHostToDevice);
cublasHandle_t handle;
cublasCreate(&handle);
cudaError_t error = cudaGetLastError();
if(error != cudaSuccess)
{
std::cout << "CUDA error: " << cudaGetErrorString(error) << std::endl;
} else {
std::cout << "No problem before cublas call\n";
}
float alpha = 1.0;
float beta = 0.0;
cublasSgemm(handle, CUBLAS_OP_N, CUBLAS_OP_N,
N, K, p, &alpha,
X_dev, N, B_dev, p, &beta, y_dev, N);
cudaDeviceSynchronize();
error = cudaGetLastError();
if(error != cudaSuccess)
{
std::cout << "CUDA error: " << cudaGetErrorString(error) << std::endl;
}
cublasDestroy(handle);
cudaFree(X_dev);
cudaFree(B_dev);
cudaFree(y_dev);
return 0;
}
我从 cuda-memcheck
得到这个错误:
========= Invalid __global__ read of size 4
========= at 0x00000a88 in void gemmSN_NN_kernel<float, int=256, int=4, int=2, int=8, int=4, int=4, cublasGemvTensorStridedBatched<float const >, cublasGemvTensorStridedBatched<float>>(cublasGemmSmallNParams<float const , cublasGemvTensorStridedBatched<float const >, float>)
========= by thread (223,0,0) in block (190,0,0)
========= Address 0x2b660269807c is out of bounds
大约有 100 个这样的地址越界错误,它们的数量在 运行 之间变化。当我将 K 设置为更大的数字(例如 10)时,问题就消失了。任何人都知道会发生什么?我在 CentOS 7 上使用 CUDA 10.1、P100。谢谢!
2020 年 9 月 21 日更新: 这个问题在我更新到 CUDA 11 后就没有了。
如评论中所述,这似乎是 CUBLAS 库中的一个内部问题。我会社论并猜测他们没有针对这种具有如此小的内部产品尺寸的异常尺寸问题的测试覆盖率,并且该错误通过了未检测到的预发布测试。
与可能的错误一样,您最好将问题中的代码作为 NVIDIA developer portal 票据上的重现案例提交。