Eu implementei o CG no FORTRAN vinculando-o ao Intel MKL.
Quando houver declarações como: ( Consulte Wikipedia )
p=r;
x=x+alpha*p
r=r-alpha*Ap;
ou similares no QMR (em quantidade muito maior)
v_tld = r;
y = v_tld;
rho = norm( y );
w_tld = r;
z = w_tld;
xi = norm( z ); (and more)
Faz sentido usar implementações de nível 1 do BLAS, como DAXPY, DCOPY, DSCAL? A motivação para minha pergunta é:
Eu tenho 2 implementações dos algoritmos. Um em que apenas vinculei Normas e MatVecs ao MKL; copiar, dimensionar e adicionar é feito pelas funções intrínsecas do Fortran e outra onde todas as sub-rotinas possíveis são realizadas pelo BLAS.
Eu pensava que nada pode ficar mais rápido que o BLAS. Mas, acontece que meu código usando as funções intrínsecas do Fortran correu 100% mais rápido que um com as sub-rotinas BLAS Nível 1 (FWIW, este não era um problema pequeno, estava resolvendo um sistema denso de tamanho 13k x 13k que preenchia minhas 4 GB de RAM). Eu estava executando ambos em 2 threads (em uma máquina de 2 núcleos)
ifort QMR.f90 -mkl
comMKL_DYNAMIC=TRUE
Eu fiz uma pergunta no SO referente à extensão do BLAS, mas ao tentar incluir o BLAS Nível 1 no meu código, meu código continuava ficando cada vez mais lento.
Estou fazendo algo errado ou isso é esperado?
Além disso, faz sentido tentar estender o BLAS para executar operações não óbvias como y = 2.89*x
por DCOPY(n,2.89*x,1,y,1) or even DSCAL then DCOPY
?
O que também é interessante é DDOT
e DNRM2
melhorar o desempenho. Atribuí-o ao fato de que, uma vez que realizam multiplicações de precisão dupla, colocá-las em paralelo pode ajudar.
Pergunta complementar: Quando você decide se uma operação BLAS nível 1 realmente ajudará o desempenho?
Adicionando: Atualmente, estou executando um laptop i3 de 2,13 GHz com 4 GB de RAM e informações de Proc Debian de 64 bits aqui . Porém, recebo respostas semelhantes em uma estação de trabalho Intel Xeon 12 core com 24 GB de RAM.