Cuda 无法使用cublasXt

Cuda 无法使用cublasXt,cuda,cublas,Cuda,Cublas,我尝试了下面的简单程序,使用cublasXt将两个矩阵相乘。我得到的都是零输出。有人能告诉我为什么吗?我的电脑可以正常使用其他cuda库,我有两个GPU。我的机器是64位的,这是cublasXt所要求的 顺便说一句,我已经检查过程序中没有函数调用返回错误 #include <stdio.h> #include "cublasXt.h" #include <curand.h> void fill(double* &x, long m, long n, double

我尝试了下面的简单程序,使用cublasXt将两个矩阵相乘。我得到的都是零输出。有人能告诉我为什么吗?我的电脑可以正常使用其他cuda库,我有两个GPU。我的机器是64位的,这是cublasXt所要求的

顺便说一句,我已经检查过程序中没有函数调用返回错误

#include <stdio.h>
#include "cublasXt.h"
#include <curand.h>

void fill(double* &x, long m, long n, double val) {
  x = new double[m * n];
  for (long i = 0; i < m; ++i) {
    for (long j = 0; j < n; ++j) {
      x[i * n + j] = val;
    }
  }
}

int main() {
  cublasXtHandle_t xt_;
  cublasXtCreate(&xt_);

  double *A, *B, *C;
  long m = 10, n = 10, k = 20;

  fill(A, m, k, 0.2);
  fill(B, k, n, 0.3);
  fill(C, m, n, 0.0);

  double alpha = 1.0;
  double beta = 0.0;

  cublasXtDgemm(xt_, CUBLAS_OP_N, CUBLAS_OP_N,
    m, n, k, &alpha, A, m, B, k, &beta, C, m
  );

  cudaDeviceSynchronize();

  for (int i = 0; i < m; ++i) {
    for (int j = 0; j < n; ++j) {
      printf ("%lf ", C[i *n + j]);
    }
    printf ("\n");
  }

  cublasXtDestroy(xt_);
  return 0;
}
#包括
#包括“cublasXt.h”
#包括
空隙填充(双*&x、长m、长n、双val){
x=新的双精度[m*n];
对于(长i=0;i
您的代码的第一个问题是您无权访问。这是cublasXt代码的必要部分,用于告诉CUBLAS运行时要使用多少设备以及要使用哪些设备

作为一个简单的证明,请尝试在句柄创建调用后立即添加以下内容:

if(cublasXtCreate(&xt_) != CUBLAS_STATUS_SUCCESS) {printf("handle create fail\n"); return 1;}
int devices[1] = { 0 };  // add this line
if(cublasXtDeviceSelect(xt_, 1, devices) != CUBLAS_STATUS_SUCCESS) {printf("set devices fail\n"); return 1;} // add this line
这将导致输出从所有零更改为所有1.2(尽管仅使用1个GPU)

但是,您可能需要阅读我上面链接的文档部分(例如,如果您想要使用2个GPU,并且它们的类型正确)。此时,多GPU使用的cublasXt功能(包括在工具包中)仅限于2个设备(但请注意我下面的评论),并且这2个GPU必须位于双GPU板上,例如特斯拉K10或GeForce GTX 690(我认为Titan Z或特斯拉K80也应该工作,仅举其他示例)


有关许可证的其他详细信息,请参阅。您可以获得对GPU限制较少的“Premier”软件包的评估版本。

我相信您仍然需要对设备进行内存管理。我认为CUBLAS不会自动为设备分配、复制和释放内存。请看cuda样本/7_CUDALibraries/simpleCUBLAS/simpleCUBLAS.cppcublasXt与普通cublas不同。指定要使用的设备后,它将处理分配。@ChristianSarofeen:没错,它不会为我释放主机内存。我只是在问问题时把它简化了。对不起,明白了。这对我来说是一个非常无聊的时刻,因为它必须分配和取消分配所有的东西,因为它需要对它进行分区。非常感谢!我认为cudaXtDeviceSelect是为了缩小GPU的范围。