BLAS и CUBLAS

Мне интересно узнать о библиотеке NVIDIA cuBLAS. У кого-нибудь есть опыт работы с этим? Например, если я напишу программу на C с использованием BLAS, смогу ли я заменить вызовы BLAS вызовами cuBLAS? Или еще лучше реализовать механизм, который позволяет пользователю выбирать во время выполнения?

Как насчет того, чтобы использовать библиотеку BLAS, предоставленную Boost с C ++?


person Nils    schedule 30.04.2010    source источник


Ответы (3)


Ответ janneb неверен, cuBLAS не заменяет CPU BLAS. Предполагается, что данные уже находятся на устройстве, а сигнатуры функций имеют дополнительный параметр для отслеживания контекста cuBLAS.

Однако в CUDA 6.0 входит новая библиотека под названием NVBLAS, которая обеспечивает именно эту функцию «вставки». Он перехватывает вызовы BLAS уровня 3 (GEMM, TRSV и т. Д.) И автоматически отправляет их на графический процессор, эффективно блокируя передачу PCIE с вычислениями на графическом процессоре.

Здесь есть некоторая информация: https://developer.nvidia.com/cublasxt, а CUDA 6.0 уже доступна для зарегистрированных разработчиков CUDA. .

Полная документация будет доступна в сети, как только CUDA 6.0 будет выпущена для широкой публики.

person Jonathan Cohen    schedule 25.02.2014

CUBLAS не оборачивается вокруг BLAS. CUBLAS также обращается к матрицам в порядке следования по столбцам, таким как некоторые коды Fortran и BLAS.

Я больше привык писать код на C, даже для CUDA. Код, написанный с помощью CBLAS (который представляет собой оболочку BLAS на языке C), можно легко преобразовать в код CUDA. Имейте в виду, что коды Fortran, использующие BLAS, сильно отличаются от кодов C / C ++, которые используют CBLAS. Fortran и BLAS обычно хранят матрицы или двойные массивы в порядке столбцов, но C / C ++ обычно обрабатывает порядок строк. Обычно я решаю эту проблему, записывая сохранение матриц в 1D-массивы, и использую #define для записи макроса для доступа к элементу i, j матрицы как:

/* define macro to access Aij in the row-wise array A[M*N] */
#define indrow(ii,jj,N) (ii-1)*N+jj-1 /* does not depend on rows M  */
/* define macro to access Aij in the col-wise array A[M*N] */
#define indcol(ii,jj,M) (jj-1)*M+ii-1 

Библиотека CBLAS имеет хорошо организованные параметры и соглашения (константные переменные перечисления), чтобы дать каждой функции порядок матрицы. Помните, что хранение матриц также может меняться, матрица с полосами по строкам не хранится так же, как матрица с полосами по столбцам.

Я не думаю, что существует механизм, позволяющий пользователю выбирать между использованием BLAS или CUBLAS, не написав код дважды. CUBLAS также имеет в большинстве вызовов функций "дескрипторную" переменную, которая не появляется в BLAS. Я хотел использовать #define для изменения имени при каждом вызове функции, но это может не сработать.

person lucky85dog    schedule 22.10.2012

Я портировал код BLAS на CUBLAS. Библиотека BLAS, которую я использую, - это ATLAS, поэтому то, что я говорю, может быть правильным только до выбора библиотеки BLAS.

ATLAS BLAS требует, чтобы вы указали, используете ли вы основной порядок столбцов или основной порядок строк, и я выбрал основной порядок столбцов, поскольку я использовал CLAPACK, который использует порядок основных столбцов. LAPACKE, с другой стороны, будет использовать основной порядок строк. CUBLAS - это порядок столбцов. Возможно, вам придется внести соответствующие изменения.

Даже если заказ не является проблемой, перенос на CUBLAS ни в коем случае не был каплей в замене. Самая большая проблема заключается в том, что вы должны перемещать данные в пространство памяти графического процессора и из него. Эта память настраивается с помощью cudaMalloc () и освобождается с помощью cudaFree (), которая действует так, как и следовало ожидать. Вы перемещаете данные в память графического процессора с помощью cudaMemcpy (). Время сделать это будет важным фактором, определяющим, стоит ли переходить с CPU на GPU.

Однако как только это будет сделано, вызовы станут довольно похожими. CblasNoTrans становится CUBLAS_OP_N, а CblasTrans становится CUBLAS_OP_T. Если ваша библиотека BLAS (как это делает ATLAS) позволяет передавать скаляры по значению, вам придется преобразовать их для передачи по ссылке (как обычно для FORTRAN).

Учитывая это, любой переключатель, который позволяет выбрать CPU / GPU, проще всего будет на более высоком уровне, чем в функции, использующей BLAS. В моем случае у меня есть варианты алгоритма CPU и GPU, и я выбрал их на более высоком уровне в зависимости от размера проблемы.

person Michael Conlen    schedule 04.04.2013