无法使用 cublasXt
Unable to use cublasXt
我尝试了以下使用 cublasXt 将两个矩阵相乘的简单程序。我得到全零输出。有人可以告诉我为什么吗?我的电脑可以正常使用其他cuda库,我有两个GPU。我的机器是64位的,符合cublasXt的要求。
顺便说一句,我已经检查了 none 程序中的函数调用 returns 错误。
#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;
}
您的代码的第一个问题是您没有调用 cublasXtDeviceSelect。这是 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,并且它们的类型正确)。目前工具包中包含的 cublasXt 功能,用于多 GPU 的使用仅限于 2 个设备(但请注意我在下面的评论)并且这 2 个 GPU 必须位于双 GPU 板上,例如 Tesla K10 或 GeForce GTX 690(我觉得Titan Z或者Tesla K80应该也可以,随便挑个例子)
许可的其他详细信息是 here。您可以获得对 GPU 限制较少的 "Premier" 包的评估版。
我尝试了以下使用 cublasXt 将两个矩阵相乘的简单程序。我得到全零输出。有人可以告诉我为什么吗?我的电脑可以正常使用其他cuda库,我有两个GPU。我的机器是64位的,符合cublasXt的要求。
顺便说一句,我已经检查了 none 程序中的函数调用 returns 错误。
#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;
}
您的代码的第一个问题是您没有调用 cublasXtDeviceSelect。这是 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,并且它们的类型正确)。目前工具包中包含的 cublasXt 功能,用于多 GPU 的使用仅限于 2 个设备(但请注意我在下面的评论)并且这 2 个 GPU 必须位于双 GPU 板上,例如 Tesla K10 或 GeForce GTX 690(我觉得Titan Z或者Tesla K80应该也可以,随便挑个例子)
许可的其他详细信息是 here。您可以获得对 GPU 限制较少的 "Premier" 包的评估版。