Итак, BLAS (подпрограммы базовой линейной алгебры) обычно представляет собой API для, как следует из названия, базовой линейной алгебры. алгебраические процедуры. Он включает векторно-векторные операции (уровень 1 blas-подпрограммы), матрично-векторные операции (уровень 2) и матрично-матричные операции (уровень 3). Доступен "reference" BLAS, который все правильно реализует, но в большинстве случаев вы будете использовать оптимизированная реализация для вашей архитектуры. cuBLAS — это реализация CUDA.
BLAS API был настолько успешным как API, описывающий базовые операции, что получил очень широкое распространение. Однако (а) имена невероятно загадочны из-за архитектурных ограничений того времени (это был 1979 год, и API был определен с использованием имен из 8 символов или меньше, чтобы обеспечить возможность широкой компиляции), и (б) он успешен, потому что он довольно общий, поэтому даже самые простые вызовы функций требуют множества посторонних аргументов.
Поскольку он настолько широко распространен, часто предполагается, что если вы занимаетесь числовой линейной алгеброй, вы уже знаете общую суть API, поэтому в руководствах по реализации часто не учитываются важные детали, и я думаю, что вы сталкиваетесь именно с этим.
Подпрограммы Уровня 2 и 3 обычно имеют имена функций в форме TMMOO..
, где T
— числовой тип матрицы/вектора (S
/D
для вещественного числа с одинарной/двойной точностью, C
/Z
для сложного с одинарной/двойной точностью), MM
— это числовой тип матрицы/вектора. тип матрицы (GE
для общего - например, просто плотная матрица, о которой больше ничего не скажешь; GB
для общей ленточной матрицы, SY
для симметричных матриц и т. д.), а OO
— операция.
Все это сейчас кажется немного нелепым, но это работало и работает относительно хорошо — вы быстро научитесь сканировать их для знакомых операций, так что SGEMV представляет собой умножение вектора на общую матрицу одинарной точности (вероятно, это то, что вам нужно, а не SGBMV). , DGEMM — это умножение матрицы на матрицу двойной точности и т. д. Но это требует некоторой практики.
Поэтому, если вы посмотрите на инструкции cublas sgemv или в документацию оригинала, вы может пройтись по списку аргументов. Во-первых, основная операция
Эта функция выполняет умножение матрицы на вектор y = a op(A)x + b y
, где A — матрица размера m x n, хранящаяся в формате по столбцам, x и y — векторы, а и — скаляры.
где op(A) может быть A, AT или AH. Итак, если вы хотите просто y = Ax
, как это часто бывает, то a = 1
, b = 0
. и transa == CUBLAS_OP_N
.
incx
— шаг между различными элементами в x
; есть много ситуаций, когда это может пригодиться, но если x
— это просто простой массив 1d, содержащий вектор, тогда шаг будет равен 1.
И это все, что вам нужно для SGEMV.
person
Jonathan Dursi
schedule
23.05.2012