2015-01-12 5 views
0

Я попробовал следующую простую программу, используя cublasXt для умножения двух матриц. Я получаю нулевой вывод. Может ли кто-нибудь сообщить мне, почему? Мой компьютер может использовать другие библиотеки cuda, и у меня есть два графических процессора. Моя машина 64 бит, как требуется cublasXt.Невозможно использовать cublasXt

Btw, я проверил, что ни одна из вызовов функций в программе не возвращает ошибку.

#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; 
} 
+0

Я считаю, что вам все еще нужно управлять памятью для устройства. Я не думаю, что CUBLAS автоматически выделяет, копирует и освобождает память для устройства. Посмотрите образцы образцов cuda/7_CUDALibraries/simpleCUBLAS/simpleCUBLAS.cpp –

+0

cublasXt отличается от обычных куб. Как только вы укажете используемые устройства, он обрабатывает распределения. –

+0

@ChristianSarofeen: вы правы, он не освобождает память хоста для меня. Я просто упрощаю это, задавая вопрос. – shaoyl85

ответ

1

Первый номер с кодом, что вы не имеете вызов 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 графических процессора, и они имеют правильный тип). Функциональность cublasXt в это время, включенная в набор инструментов, для использования с несколькими GPU ограничена двумя устройствами (но обратите внимание на мои комментарии ниже), и эти 2 графических процессора должны быть на плате с двумя GPU, такими как Tesla K10 или GeForce GTX 690 (я думаю, Titan Z или Tesla K80 также должны работать, просто чтобы выбрать другие примеры).

Дополнительные сведения о лицензировании: here. Вы можете получить оценочную версию пакета «Премьер», которая имеет меньше ограничений для графических процессоров.

+0

Большое спасибо! Я думал, что cudaXtDeviceSelect должен сузить диапазон графических процессоров. – shaoyl85