我试图做的是简单地将cublasDgemm(矩阵矩阵乘法)应用于几个具有“double”(8字节)类型元素的矩阵,所有这些元素都具有非常大的一维。在我的例子中,矩阵的大小是12755046乘46。简单地说,A[4612755046]*BӨi[12755046,46]=CӨi[46,46],其中i=1,2,3,。。。。
这台机器包括128GB内存和两个GTX2080Ti(11GB GPU内存),所以我最初的策略是将B懔i分配给每个GPU。但是,当我在两个GPU上执行代码时,总是会出现内部错误。
所以我尝试了三件事来解决这个问题:
一。仅使用一个GPU。没有错误。
2。缩小矩阵大小,但继续使用两个GPU。没有错误。
三。使用cublasXt隐式使用两个gpu。没有错误。
虽然它已经解决了,我仍然有兴趣找到一个答案,为什么我原来的计划没有工作的大维度矩阵?我猜这可能是由于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]);
}

最佳答案

cublas句柄适用于创建句柄时处于活动状态的设备。
the documentationcublasCreate
CUBLAS库上下文与当前CUDA设备相关联。
另见古巴文the description
假定与特定cuBLAS上下文相关联的设备在相应的cublasCreate()和cublascdestroy()调用之间保持不变。为了让cuBLAS库在同一主机线程中使用不同的设备,应用程序必须通过调用cudastedevice()来设置要使用的新设备,然后通过调用cuBLAS create()来创建另一个cuBLAS上下文,该上下文将与新设备相关联。
您可以使用以下方法修复代码:

for(iGPU=0;iGPU<nGPUs;iGPU++)
{
   cudaSetDevice(iGPU);              // add this line
   cublasCreate (& handle[iGPU]);
}

10-07 19:06
查看更多