БЛАС и КУБЛАС - PullRequest
       59

БЛАС и КУБЛАС

6 голосов
/ 30 апреля 2010

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

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

Ответы [ 3 ]

5 голосов
/ 25 февраля 2014

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

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

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

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

2 голосов
/ 22 октября 2012

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

Я более привык писать код на C, даже для CUDA.Код, написанный с помощью CBLAS (который является C-оболочкой BLAS), можно легко превратить в код CUDA.Имейте в виду, что коды Fortran, которые используют BLAS, весьма отличаются от кодов C / C ++, которые используют CBLAS.Fortran и BLAS обычно хранят матрицы или двойные массивы в мажорном порядке столбцов, но C / C ++ обычно обрабатывает мажорные строки.Обычно я решаю эту проблему, записывая сохранение матриц в одномерных массивах, и использую #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 также имеет в большинстве вызовов функций переменную «handle», которая не отображается в BLAS.Хотя я #define меняю имя при каждом вызове функции, но это может не сработать.

0 голосов
/ 04 апреля 2013

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

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

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

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

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

...