2010-04-30 5 views
6

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

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

ответ

1

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

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

0

Я портировал 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).

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

5

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

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

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

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