[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
O Basic Álgebra Linear Subprograms (BLAS) define um conjunto de operações fundamentais sobre vetores e matrizes que podem ser usados para criar funcionalidades otimizadas de alto nível para serem usadas em álgebra linear.
A biblioteca fornece uma camada de baixo nível que corresponde diretamente à linguagem C padrão usada pela BLAS padrão, referida aqui como “CBLAS”, e uma interface de alto nível para operações sobre vetores e matrizes da GSL. Usuários que estão interessados em operações simples sobre vetores e matrizes em quanto objetos GSL devem usar a camada de alto nível descrita nesse capítulo. As funções são declaradas no arquivo ‘gsl_blas.h’ e deve satisfazer as necessidades da maioria dos usuários.
Note que matrizes GSL estão implementadas usando armazenagem densa de forma que a interface somente inclui as funções correspondentes de armazenagem densa BLAS. A funcionalidade plena da BLAS para armazenagem de matrizes em banda e armazenagem de matrizes em pacote está disponível através da interface CBLAS de baixo nível. Similarmente, vetores da GSL estão restritos a saltos positivos, ao passo que a interface CBLAS de baixo nível suporta saltos negativos como especificado no padrão BLAS.(34)
A interface para a camada gsl_cblas
é especificado no arquivo
‘gsl_cblas.h’. Essa interface corresponde ao padrão de fóruns técnicos da
BLAS para a interface C para implementações de BLAS
herdadas. Usuários que possuem acesso a outras implementações CBLAS que seguem as regras
padronizadas podem usar ‘gsl_cblas.h’ em lugar de versões fornecidas pela
biblioteca. Note que usuários que possuem somente uma biblioteca BLAS de Fortran podem
usar um pacote CBLAS que obedece às especificações para converter seus arquivos em Fortran para uma
biblioteca CBLAS. Uma referência a pacote CBLAS para implemetações
Fortran herdadas existe como parte da CBLAS padrão e pode
ser obtida na Netlib (35). O conjunto completo de funções da CBLAS é
listada em um apêndice (veja seção Biblioteca CBLAS da GSL).
Existem três níveis de operações BLAS,
Operações com vetores, e.g. y = \alpha x + y
Operações matriz-vetor, e.g. y = \alpha A x + \beta y
Operações matriz-matriz, e.g. C = \alpha A B + C
Cada rotina tem um nome que especifica a operação, o tipo de matrizes involvidas e sua precisão. Algumas das operações mais comuns e seus nomes são fornecidas abaixo,
produto escalar, x^T y
soma de vetores, \alpha x + y
produto matriz-vetor, A x
resolve matriz-vetor, inv(A) x
produto matriz-matriz, A B
resolve matriz-matriz, inv(A) B
Os tipos de matrizes são,
geral
banda geral
simétrica
banda simétrica
pacote simétrica
de Hermite
banda de Hermite
pacote de Hermite
triangular
banda triangular
pacote triangular
Cada operação está definida para quatro precisões,
real de precisão simples
real de precisão dupla
complexo de precisão simples
complexo de precisão dupla
Dessa forma, por exemplo, o nome SGEMM significa “single-precision general matrix-matrix multiply” e ZGEMM significa “double-precision complex matrix-matrix multiply”.
Note que argumentos vetores e matrizes para funções BLAS não devem ter nomes alternativos (alias), já que os resultados são indefinidos quando os respectivos vetores estáticos sobrescrevem (veja seção Nomes alternativos para vetores estáticos).
13.1 Interface GSL BLAS | ||
13.2 Exemplos | ||
13.3 Referências e Leituras Adicionais |
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
GSL fornece objetos densos em forma de vetores e em forma de matrizes, baseado sobre tipos internos relevantes. A biblioteca fornece uma interface para operações na BLAS que aplicam esses objetos. A interface para essa funcionalidade é fornecida no arquivo ‘gsl_blas.h’.
13.1.1 Nível 1 | ||
13.1.2 Nível 2 | ||
13.1.3 Nível 3 |
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essa função calcula a soma \alpha + x^T y para os vetores x e y, retornando o resultado em result.
Essas funções calculam o produto escalar x^T y para os vetores x e y, retornando o resultado em result.
Essas funções calculam o produto escalar complexo x^T y para os vetores x e y, retornando o resultado em dotu
Essas funções calculam o produto escalar conjugado complexo x^H y para os vetores x e y, retornando o resutado em dotc
Essas funções calculam o módulo ou norma Euclideana ||x||_2 = \sqrt {\sum x_i^2} do vetor x.
Essas funções calculam o módulo ou norma Euclideana do vetor complexo x,
|
Essas funções calculam a soma absoluta \sum |x_i| dos elementos do vetor x.
Essas funções calculam a soma dos valores absolutos das partes real e imaginárias do vetor complexo x, \sum |\Re(x_i)| + |\Im(x_i)|.
Essas funções retornam o índice do maior elemento do vetor x. O maior elemento é determinado por seu valor absoluto para vetores reais e pela soma dos valores absolutos das partes reais e imaginárias |\Re(x_i)| + |\Im(x_i)| para vetores complexos. Se o maior valor ocorrer repetidas vezes então o índice da primeira ocorrência é retornado.
Essas funções trocam os elementos dos vetores x e y.
Essas funções copiam os elementos do vetor x para o vetor y.
Essas funções calculam a soma y = \alpha x + y para os vetores x e y.
Essas funções alteram o vetor x através de um fator multiplicativo alpha.
Essas funções calculam uma rotação de Givens (c,s) que zera o
vetor (a,b),
|
Essas funções aplicam uma rotação de Givens (x', y') = (c x + s y, -s x + c y) aos vetores x, y.
Essas funções calculam uma transformação de Givens modificada. A transformação de Givens modificada é definida na especificação da BLAS Nível 1 original, fornecida nas referências.
Essas funções aplicam uma transformação de Givens.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essas funções calculam a soma e o produto matriz-vetor y =
\alpha op(A) x + \beta y, onde op(A) = A,
A^T, A^H para TransA = CblasNoTrans
,
CblasTrans
, CblasConjTrans
.
Essas funções calculam o produto matriz-vetor
x = op(A) x para a matriz triangular A, onde
op(A) = A, A^T, A^H para TransA =
CblasNoTrans
, CblasTrans
, CblasConjTrans
. Quando
Uplo for CblasUpper
então o triângulo alto de A é
usado, e quando Uplo for CblasLower
então o triângulo baixo
de A é usado. Se Diag for CblasNonUnit
então a
diagonal da matriz é usada, mas se Diag for CblasUnit
então os elementos da diagonal da matriz A são tomados como unitários e
não são referenciados.
Essas funções calculam inv(op(A)) x para x, onde
op(A) = A, A^T, A^H para TransA =
CblasNoTrans
, CblasTrans
, CblasConjTrans
. Quando
Uplo for CblasUpper
então o triângulo alto de A é
usado, e quando Uplo for CblasLower
então o triângulo baixo
de A é usado. Se Diag for CblasNonUnit
então a
diagonal da matriz é usada, mas se Diag for CblasUnit
então os elementos da diagonal da matriz A são tomados como sendo unitários e
não são referenciados.
Essas funções calculam a soma e o produto matriz-vetor y =
\alpha A x + \beta y para a matriz simétrica A. Uma vez que a
matriz A é simétrica somente sua meia parte alta ou baixa precisa ser
armazenada. Quando Uplo for CblasUpper
então o triângulo alto
e a diagonal de A são usados, e quando Uplo for
CblasLower
então o triângulo baixo e a diagonal de A são
usados.
Essas funções calculam o produto e a soma matriz-vetor y =
\alpha A x + \beta y para a matriz de Hermite A. Uma vez que a
matriz A é de Hermite somente sua metade alta ou baixa precisa ser
armazenada. Quando Uplo for CblasUpper
então o triângulo alto
e a diagonal de A são usados, e quando Uplo for
CblasLower
então o triângulo baixo e a diagonal de A são
usados. Os elementos imaginários da diagonal são automaticamente assumidos
serem zero e não são referenciados.
Essas funções calculam a atualização rank-1 A = \alpha x y^T + A da matriz A.
Essas funções calculam o conjugado da atualização rank-1 A = \alpha x y^H + A da matriz A.
Essas funções calculam a atualização rank-1 simétrica A = \alpha x
x^T + A da matriz simétrica A. Uma vez que a matriz A é
simétrica somente sua metade alta ou baixa precisa ser armazenada. Quando
Uplo for CblasUpper
então o triângulo alto e a diagonal de
A são usados, e quando Uplo for CblasLower
então o
triângulo baixo e a diagonal de A são usados.
Essas funções calculam a atualização rank-1 de Hermite A = \alpha x
x^H + A da matriz de Hermite A. Uma vez que a matriz A é
de Hermite somente sua metade alta ou baixa precisa ser armazenada. Quando
Uplo for CblasUpper
então o triângulo alto e a diagonal de
A são usados, e quando Uplo for CblasLower
então o
triângulo baixo e a diagonal de A são usados. Os elementos imaginários
da diagonal são automaticamente ajustados para zero.
Essas funções calculam a atualização rank-2 simétrica A = \alpha x
y^T + \alpha y x^T + A da matriz simétrica A. Uma vez que a
matriz A é simétrica somente sua metade alta ou baixa precisa ser
armazenada. Quando Uplo for CblasUpper
então o triângulo alto
e a diagonal de A são usados, e quando Uplo for
CblasLower
enttão o triângulo baixo e a diagonal de A são
usados.
Essas funções calculam a atualização rank-2 de Hermite A = \alpha x
y^H + \alpha^* y x^H + A da matriz de Hermite A. Uma vez que a
matriz A é de Hermite somente sua metade alta ou baixa precisa ser
armazenada. Quando Uplo for CblasUpper
então o triângulo alto
e a diagonal de A são usados, e quando Uplo for
CblasLower
então o triângulo baixo e a diagonal de A são
usados. Os elementos imaginários da diagona são automaticamente ajustados para zero.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Essas funções calculam o produto matriz-matriz e a soma C =
\alpha op(A) op(B) + \beta C onde op(A) = A, A^T,
A^H para TransA = CblasNoTrans
, CblasTrans
,
CblasConjTrans
e similarmente para o parâmetro TransB.
Essas funções calculam o produto matriz-matriz e a soma C =
\alpha A B + \beta C para Side sendo CblasLeft
e C =
\alpha B A + \beta C para Side sendo CblasRight
, onde a
matriz A é simétrica. Quando Uplo for CblasUpper
então
o triângulo alto e a diagonal de A são usados, e quando Uplo
for CblasLower
então o triângulo baixo e a diagonal de A são
usados.
Essas funções calculam o produto matriz-matriz e a soma C =
\alpha A B + \beta C para Side sendo CblasLeft
e C =
\alpha B A + \beta C para Side sendo CblasRight
, onde a
matriz A é de Hermite. Quando Uplo for CblasUpper
então
o triângulo alto e a diagonal de A são usados, e quando Uplo
for CblasLower
então o triângulo baixo e a diagonal de A são
usados. Os elementos imaginários da diagonal são automaticamente ajustados para
zero.
Essas funções calculam o produto matriz-matriz B = \alpha op(A)
B para Side sendo CblasLeft
e B = \alpha B op(A) para
Side sendo CblasRight
. A matriz A é triangular e
op(A) = A, A^T, A^H para TransA =
CblasNoTrans
, CblasTrans
, CblasConjTrans
. Quando
Uplo for CblasUpper
então o triângulo alto de A é
usado, e quando Uplo for CblasLower
então o triângulo baixo
de A é usado. Se Diag for CblasNonUnit
então a
diagonal de A é usada, mas se Diag for CblasUnit
então
os elementos da diagonal da matriz A são tomados como unitários e não
são referenciados.
Essas funções calculam produto matriz inversa matriz
B = \alpha op(inv(A))B para Side sendo
CblasLeft
e B = \alpha B op(inv(A)) para
Side sendo CblasRight
. A matriz A é triangular e
op(A) = A, A^T, A^H para TransA =
CblasNoTrans
, CblasTrans
, CblasConjTrans
. Quando
Uplo for CblasUpper
então o triângulo alto de A é
usado, e quando Uplo for CblasLower
então o triângulo baixo
de A é usado. Se Diag for CblasNonUnit
então a
diagonal de A é usada, mas se Diag for CblasUnit
então
os elementos da diagonal da matriz A são tomados como unitários e não
são referenciados.
Essas funções calcula a atualização rank-k da matriz simétrica C,
C = \alpha A A^T + \beta C quando Trans for
CblasNoTrans
e C = \alpha A^T A + \beta C quando
Trans for CblasTrans
. Uma vez que a matriz C é simétrica
somente sua metade alta ou baixa precisa ser armazenada. Quando Uplo for
CblasUpper
então o triângulo alto e a diagonal de C são
usados, e quando Uplo for CblasLower
então o triângulo baixo
e a diagonal de C são usados.
Essas funções calculam uma atualização rank-k da matriz de Hermite C,
C = \alpha A A^H + \beta C quando Trans for
CblasNoTrans
e C = \alpha A^H A + \beta C quando
Trans for CblasConjTrans
. Uma vez que a matriz C é de Hermite
somente sua metade alta ou baixa precisa ser armazenada. Quando Uplo for
CblasUpper
então o triângulo alto e a diagonal de C são
usados, e quando Uplo for CblasLower
então o triângulo baixo
e a diagonal de C são usados. Os elementos imaginários da
diagonal são automaticamente ajustados para zero.
Essas funções calculam uma atualização rank-2k da matriz simétrica C,
C = \alpha A B^T + \alpha B A^T + \beta C quando Trans for
CblasNoTrans
e C = \alpha A^T B + \alpha B^T A + \beta C quando
Trans for CblasTrans
. Uma vez que a matriz C é simétrica
somente sua metade alta ou baixa precisa ser armazenada. Quando Uplo for
CblasUpper
então o triângulo alto e a diagonal de C são
usados, e quando Uplo for CblasLower
então o trângulo baixo
e a diagonal de C são usados.
Essas funções calculam uma atualização rank-2k da matriz de Hermite C,
C = \alpha A B^H + \alpha^* B A^H + \beta C quando Trans for
CblasNoTrans
e C = \alpha A^H B + \alpha^* B^H A + \beta C quando
Trans for CblasConjTrans
. Uma vez que a matriz C é de Hermite
somente sua metade alta ou baixa precisa ser armazenada. Quando Uplo for
CblasUpper
então o triângulo alto e a diagonal de C são
usados, e quando Uplo for CblasLower
então o triângulo baixo
e a diagonal de C são usados. Os elementos imaginários da
diagonal são automaticamente ajustados para zero.
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
O seguinte programa calcula o produto de duas matrizes usando a
função DGEMM da BLAS Nível-3,
|
#include <stdio.h> #include <gsl/gsl_blas.h> int main (void) { double a[] = { 0.11, 0.12, 0.13, 0.21, 0.22, 0.23 }; double b[] = { 1011, 1012, 1021, 1022, 1031, 1032 }; double c[] = { 0.00, 0.00, 0.00, 0.00 }; gsl_matrix_view A = gsl_matrix_view_array(a, 2, 3); gsl_matrix_view B = gsl_matrix_view_array(b, 3, 2); gsl_matrix_view C = gsl_matrix_view_array(c, 2, 2); /* Compute C = A B */ gsl_blas_dgemm (CblasNoTrans, CblasNoTrans, 1.0, &A.matrix, &B.matrix, 0.0, &C.matrix); printf ("[ %g, %g\n", c[0], c[1]); printf (" %g, %g ]\n", c[2], c[3]); return 0; }
Aqui está a saída do programa,
$ ./a.out[ 367.76, 368.12 674.06, 674.72 ]
[ << ] | [ < ] | [ Acima ] | [ > ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Informação sobre as especificações da BLAS, incluindo ambas as especificações da interface herdada e as especificações da interface atualizada, está disponível online no sítio da BLAS e no sítio do BLAS Technical Forum.
Os seguintes artigos possuem especificações para os níveis da BLAS Nível 1, Nível 2 e Nível 3.
Versões no formato postscript dos últimos dois artigos estão disponíveis em http://www.netlib.org/blas/. Um pacote CBLAS para bibliotecas Fortran BLAS está disponível na mesma localização.
[ << ] | [ >> ] | [Topo] | [Conteúdo] | [Índice] | [ ? ] |
Esse documento foi gerado em 23 de Julho de 2013 usando texi2html 5.0.