我试图做的只是简单地将cublasDgemm (矩阵-矩阵乘法)应用于几个具有“双”(8字节)类型元素的矩阵,所有这些矩阵都具有非常大的一维。在我的例子中,矩阵的大小是12755046乘46。简单地说,A46,12755046*B_i12755046,46 = C_i46,46,其中i= 1,2,3,.
这台机器包含128 to内存和两个GTX2080Ti (11 to内存),所以我最初的策略是将B_i分发给每个GPU。然而,当我在两个GPU上执行我的代码时,我总是会得到内部错误。
因此,我通过尝试三种方法解决了这个问题: 1.只使用一个GPU。没有错误。2.缩小矩阵大小,但继续使用两个GPU。没有错误。3.使用隐式使用两个GPU的cublasXt。没有错误。
虽然它已经解决了,但我仍然有兴趣找到一个答案,为什么我原来的计划不适用于大维矩阵?我猜想这可能是由于来自cublas的一些内部限制,还是我错过了一些配置?
我在这里附加了我的简化代码,以说明我的原始计划:
double *A, *B[2], *C[2];
cudaMallocManaged(&A, 46*12755046*sizeof(double));
cudaMallocManaged(&B[0], 46*12755046*sizeof(double));
cudaMallocManaged(&B[1], 46*12755046*sizeof(double));
cudaMallocManaged(&C[0], 46*12755046*sizeof(double));
cudaMallocManaged(&C[1], 46*12755046*sizeof(double));
givevalueto(A);
givevalueto(B[0]);
givevalueto(B[1]);
double alpha = 1.0;
double beta = 0.0;
cublasHandle_t handle[nGPUs];
int iGPU;
for(iGPU=0;iGPU<nGPUs;iGPU++)
{
cublasCreate (& handle[iGPU]);
}
for(iGPU=0;iGPU<nGPUs;i++)
{
cudaSetDevice(iGPU);
cublasDgemm(handle[iGPU],CUBLAS_OP_N,CUBLAS_OP_N,46,46,12755046,&alpha,A,46,B[iGPU],12755046,&beta,C[iGPU],46);
}
for(iGPU=0;iGPU<nGPUs;i++)
{
cudaSetDevice(iGPU);
cudaDeviceSynchronize();
}
for(iGPU=0;iGPU<nGPUs;iGPU++)
{
cudaFree(B[iGPU]);
}发布于 2019-10-18 18:34:32
cublas句柄适用于创建句柄时处于活动状态的设备。
从文献资料到cublasCreate
CUBLAS库上下文与当前的CUDA设备相关联。
还请参见cublas上下文的描述:
假定与特定cuBLAS上下文关联的设备在相应的cublasCreate()和cublasDestroy()调用之间保持不变。为了让cuBLAS库在同一个主机线程中使用不同的设备,应用程序必须通过调用cudaSetDevice()来设置要使用的新设备,然后通过调用cublasCreate()创建另一个与新设备相关联的cuBLAS上下文。
您可以使用以下方法修复代码:
for(iGPU=0;iGPU<nGPUs;iGPU++)
{
cudaSetDevice(iGPU); // add this line
cublasCreate (& handle[iGPU]);
}https://stackoverflow.com/questions/58455094
复制相似问题