Python tão rápido quanto Fortran?                               Nelson Luís Dias11    Professor Associado, Departamento de...
1                      Pesquisa e programação• Programas (em geral) são meios para fazer pesquisa.  Lemma  UFPR
1                       Pesquisa e programação• Programas (em geral) são meios para fazer pesquisa.• Portanto, a pergunta ...
1                       Pesquisa e programação• Programas (em geral) são meios para fazer pesquisa.• Portanto, a pergunta ...
1                       Pesquisa e programação• Programas (em geral) são meios para fazer pesquisa.• Portanto, a pergunta ...
2              Principais pontos desta apresentação:• Python é conveniente, mas é lento.  Lemma  UFPR
2              Principais pontos desta apresentação:• Python é conveniente, mas é lento.• Fortran é muito menos convenient...
2              Principais pontos desta apresentação:• Python é conveniente, mas é lento.• Fortran é muito menos convenient...
3        Parte I: Fortran × Python em Linux, sem BLASLemmaUFPR
3            Parte I: Fortran × Python em Linux, sem BLASFortran:• várias linguagens em uma (F66, F77,  F90, F95, F03, F08...
3            Parte I: Fortran × Python em Linux, sem BLASFortran:                                      Python:• várias lin...
4                                    Gênesis1. No princípio, criou Deus os céus e a terra.2. E a terra era sem forma e vaz...
4                                    Gênesis1. No princípio, criou Deus os céus e a terra.2. E a terra era sem forma e vaz...
5                              Portanto, comece com Fortran1 program cacumij2 integer , parameter :: n = 50003 real ( kind...
5                              Portanto, comece com Fortran1 program cacumij2 integer , parameter :: n = 50003 real ( kind...
6                    E agora compare com Python + Numpy1 # !/ usr / bin / python2 from numpy import arange , array , int32...
6                    E agora compare com Python + Numpy1 # !/ usr / bin / python2 from numpy import arange , array , int32...
7                             Observações• O algoritmo                                  aij = i + j  aparentemente não é v...
7                             Observações• O algoritmo                                  aij = i + j  aparentemente não é v...
7                             Observações• O algoritmo                                  aij = i + j  aparentemente não é v...
8                                     Troque i com j1 program cacumji2 integer , parameter :: n = 50003 real ( kind =8) ::...
8                                     Troque i com j1 program cacumji2 integer , parameter :: n = 50003 real ( kind =8) ::...
9                         E dê mais uma tentativa a Python1 # !/ usr / bin / python2 from numpy import arange , array , in...
9                          E dê mais uma tentativa a Python1 # !/ usr / bin / python2 from numpy import arange , array , i...
10                                     . . . e mais uma:1 # !/ usr / bin / python2 from numpy import arange , array , int3...
10                                     . . . e mais uma:1 # !/ usr / bin / python2 from numpy import arange , array , int3...
11                       Conclusões desta parte• Um bom conhecimento dos detalhes de uma linguagem (no caso, como Fortran ...
12                       O efeito que BLAS faz. . .BLAS = Basic Linear Algebra Subprograms.BLAS é um conjunto altamente ot...
13                       Produto de 2 matrizes em Fortran:1 program cabum2 integer , parameter :: size = 10003 real ( kind...
13                       Produto de 2 matrizes em Fortran:1 program cabum2 integer , parameter :: size = 10003 real ( kind...
13                       Produto de 2 matrizes em Fortran:1 program cabum2 integer , parameter :: size = 10003 real ( kind...
14                   Produto de 2 matrizes em Python/Numpy:1 # !/ usr / bin / python2 import numpy3 n = 10004 a = numpy . ...
14                   Produto de 2 matrizes em Python/Numpy:1 # !/ usr / bin / python2 import numpy3 n = 10004 a = numpy . ...
15                       Conclusões, com BLAS• BLAS faz toda a diferença: não saia de casa sem ele.  Lemma  UFPR
15                       Conclusões, com BLAS• BLAS faz toda a diferença: não saia de casa sem ele.• BLAS torna um program...
15                       Conclusões, com BLAS• BLAS faz toda a diferença: não saia de casa sem ele.• BLAS torna um program...
15                       Conclusões, com BLAS• BLAS faz toda a diferença: não saia de casa sem ele.• BLAS torna um program...
16                     III: Rodando em WindowsPor que desenvolver para Windows?  Lemma  UFPR
16                      III: Rodando em WindowsPor que desenvolver para Windows?Porque muitos não têm acesso a Linux.  Lem...
16                      III: Rodando em WindowsPor que desenvolver para Windows?Porque muitos não têm acesso a Linux.Como ...
17                  Dentro de um prompt de Windows7Rodando dentro de uma máquina virtual (Virtual Box) Windows7gfortran - ...
18                       Conclusões desta parte• Não há numba em meu Windows7; portanto, não há comparação com  cacumij.py...
19                           Conclusões gerais• Não é possível ainda prescindir totalmente de Fortran ou C: vale a pena ma...
19                           Conclusões gerais• Não é possível ainda prescindir totalmente de Fortran ou C: vale a pena ma...
20        Thanks!LemmaUFPR
Próximos SlideShares
Carregando em…5
×

Python tão rápido quanto FORTRAN?

799 visualizações

Publicada em

Dissertaçaõ sobre o desempenho de Python e Fortran em computação científica

0 comentários
0 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

  • Seja a primeira pessoa a gostar disto

Sem downloads
Visualizações
Visualizações totais
799
No SlideShare
0
A partir de incorporações
0
Número de incorporações
3
Ações
Compartilhamentos
0
Downloads
16
Comentários
0
Gostaram
0
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Python tão rápido quanto FORTRAN?

  1. 1. Python tão rápido quanto Fortran? Nelson Luís Dias11 Professor Associado, Departamento de Engenharia Ambiental, Universidade Federal do Paraná, e-mail: nldias@ufpr.br. url: www.lemma.ufpr.br/nldias 3 de janeiro de 2013 Lemma UFPR
  2. 2. 1 Pesquisa e programação• Programas (em geral) são meios para fazer pesquisa. Lemma UFPR
  3. 3. 1 Pesquisa e programação• Programas (em geral) são meios para fazer pesquisa.• Portanto, a pergunta principal de pesquisa/programação é: Quais são as melhores ferramentas para cada tarefa? Lemma UFPR
  4. 4. 1 Pesquisa e programação• Programas (em geral) são meios para fazer pesquisa.• Portanto, a pergunta principal de pesquisa/programação é: Quais são as melhores ferramentas para cada tarefa?• Não há uma única resposta, porque, como sempre, o resultado depende do conhecimento que o usuário tem da ferramenta. Lemma UFPR
  5. 5. 1 Pesquisa e programação• Programas (em geral) são meios para fazer pesquisa.• Portanto, a pergunta principal de pesquisa/programação é: Quais são as melhores ferramentas para cada tarefa?• Não há uma única resposta, porque, como sempre, o resultado depende do conhecimento que o usuário tem da ferramenta.• Nesta apresentação: algumas técnicas para fazer bom uso de Fortran × Python Lemma UFPR
  6. 6. 2 Principais pontos desta apresentação:• Python é conveniente, mas é lento. Lemma UFPR
  7. 7. 2 Principais pontos desta apresentação:• Python é conveniente, mas é lento.• Fortran é muito menos conveniente, e verborrágico, mas é muito rápido. Lemma UFPR
  8. 8. 2 Principais pontos desta apresentação:• Python é conveniente, mas é lento.• Fortran é muito menos conveniente, e verborrágico, mas é muito rápido.• Mas BLAS muda tudo, e torna Python (com Numpy e Numba) quase tão rápido quanto — ou até mesmo mais rápido que — Fortran. Lemma UFPR
  9. 9. 3 Parte I: Fortran × Python em Linux, sem BLASLemmaUFPR
  10. 10. 3 Parte I: Fortran × Python em Linux, sem BLASFortran:• várias linguagens em uma (F66, F77, F90, F95, F03, F08)• muito grande e mais difícil de aprender e dominar• muito popular entre cientistas e enge- nheiros• muito rápido (compilado) Lemma UFPR
  11. 11. 3 Parte I: Fortran × Python em Linux, sem BLASFortran: Python:• várias linguagens em uma (F66, F77, • uma única linguagem F90, F95, F03, F08) • muitas bibliotecas padrão, e muitas ex-• muito grande e mais difícil de aprender e tensões dominar • pequena e simples• muito popular entre cientistas e enge- • muito lento (interpretado) nheiros • Numpy, Scipy, SymPy, rPython: gigan-• muito rápido (compilado) tescas bibliotecas numéricas e simbóli- cas pré-compiladas (em Fortran ou C) e disponíveis Lemma UFPR
  12. 12. 4 Gênesis1. No princípio, criou Deus os céus e a terra.2. E a terra era sem forma e vazia; e havia trevas sobre a face do abismo; e o Espírito de Deus se movia sobre a face das águas.3. E disse Deus: Haja luz Fortran. E houve luz.4. E viu Deus que era boa a luz; e fez Deus separação entre a luz Fortran e as trevas tabelas de logaritmos.5. E Deus chamou à luz Dia; e às trevas chamou Noite. E foi a tarde e a manhã: o dia primeiro. Lemma UFPR
  13. 13. 4 Gênesis1. No princípio, criou Deus os céus e a terra.2. E a terra era sem forma e vazia; e havia trevas sobre a face do abismo; e o Espírito de Deus se movia sobre a face das águas.3. E disse Deus: Haja luz Fortran. E houve luz.4. E viu Deus que era boa a luz; e fez Deus separação entre a luz Fortran e as trevas tabelas de logaritmos.5. E Deus chamou à luz Dia; e às trevas chamou Noite. E foi a tarde e a manhã: o dia primeiro.Fortran (1957) foi a primeira linguagem de programação de “alto nível” (que usavaum compilador). Lemma UFPR
  14. 14. 5 Portanto, comece com Fortran1 program cacumij2 integer , parameter :: n = 50003 real ( kind =8) :: a (0: n -1 ,0: n -1)4 integer ( kind =4) :: i ,j5 call cpu_time ( t1 )6 do i = 0,n -17 do j = 0,n -18 a(i ,j ) = i +j9 end do10 end do11 call cpu_time ( t2 )12 write (* ,*) t2 - t113 end program Lemma UFPR
  15. 15. 5 Portanto, comece com Fortran1 program cacumij2 integer , parameter :: n = 50003 real ( kind =8) :: a (0: n -1 ,0: n -1)4 integer ( kind =4) :: i ,j5 call cpu_time ( t1 )6 do i = 0,n -17 do j = 0,n -18 a(i ,j ) = i +j9 end do10 end do11 call cpu_time ( t2 )12 write (* ,*) t2 - t113 end program gfortran cacumij . f90 -o cacumij ./ cacumij 0.552033007 Lemma UFPR
  16. 16. 6 E agora compare com Python + Numpy1 # !/ usr / bin / python2 from numpy import arange , array , int32 , float64 , zeros3 from time import time4 n = 50005 t1 = time ()6 ix = arange (n , dtype = int32 )7 iy = arange (n , dtype = int32 )8 a = zeros ((n , n), float64 )9 a = ix [: , None ] + iy [ None ,:]10 t2 = time ()11 print t2 - t1 Lemma UFPR
  17. 17. 6 E agora compare com Python + Numpy1 # !/ usr / bin / python2 from numpy import arange , array , int32 , float64 , zeros3 from time import time4 n = 50005 t1 = time ()6 ix = arange (n , dtype = int32 )7 iy = arange (n , dtype = int32 )8 a = zeros ((n , n), float64 )9 a = ix [: , None ] + iy [ None ,:]10 t2 = time ()11 print t2 - t1 ./ cacum . py 0.309801101685 Lemma UFPR
  18. 18. 7 Observações• O algoritmo aij = i + j aparentemente não é vetorizável: BLAS (que surgirá daqui a pouco) não se aplica.• No entanto, a sintaxe de cacum.py é vetorial (e um pouco estranha para os não-iniciados). Lemma UFPR
  19. 19. 7 Observações• O algoritmo aij = i + j aparentemente não é vetorizável: BLAS (que surgirá daqui a pouco) não se aplica.• No entanto, a sintaxe de cacum.py é vetorial (e um pouco estranha para os não-iniciados).• cacum.py é quase duas vezes mais rápido que cacumij.f90. Lemma UFPR
  20. 20. 7 Observações• O algoritmo aij = i + j aparentemente não é vetorizável: BLAS (que surgirá daqui a pouco) não se aplica.• No entanto, a sintaxe de cacum.py é vetorial (e um pouco estranha para os não-iniciados).• cacum.py é quase duas vezes mais rápido que cacumij.f90.• o que está errado? Lemma UFPR
  21. 21. 8 Troque i com j1 program cacumji2 integer , parameter :: n = 50003 real ( kind =8) :: a (0: n -1 ,0: n -1)4 integer ( kind =4) :: i ,j5 call cpu_time ( t1 )6 do j = 0,n -17 do i = 0,n -18 a(i ,j ) = i +j9 end do10 end do11 call cpu_time ( t2 )12 write (* ,*) t2 - t113 end program Lemma UFPR
  22. 22. 8 Troque i com j1 program cacumji2 integer , parameter :: n = 50003 real ( kind =8) :: a (0: n -1 ,0: n -1)4 integer ( kind =4) :: i ,j5 call cpu_time ( t1 )6 do j = 0,n -17 do i = 0,n -18 a(i ,j ) = i +j9 end do10 end do11 call cpu_time ( t2 )12 write (* ,*) t2 - t113 end program gfortran cacumji . f90 -o cacumji ./ cacumji 0.212011993 Lemma UFPR
  23. 23. 9 E dê mais uma tentativa a Python1 # !/ usr / bin / python2 from numpy import arange , array , int32 , zeros3 from time import time4 n = 50005 t1 = time ()6 a = zeros ((n , n), f8 )7 def aom (a ):8 for i in range (n ):9 for j in range (n ):10 a[i ,j ] = i +j11 aom (a )12 t2 = time ()13 print t2 - t1 Lemma UFPR
  24. 24. 9 E dê mais uma tentativa a Python1 # !/ usr / bin / python2 from numpy import arange , array , int32 , zeros3 from time import time4 n = 50005 t1 = time ()6 a = zeros ((n , n), f8 )7 def aom (a ):8 for i in range (n ):9 for j in range (n ):10 a[i ,j ] = i +j11 aom (a )12 t2 = time ()13 print t2 - t1 ./ cacumij - slow . py 4.56774091721 Lemma UFPR
  25. 25. 10 . . . e mais uma:1 # !/ usr / bin / python2 from numpy import arange , array , int32 , zeros3 from time import time4 from numba import jit , float645 n = 50006 t1 = time ()7 a = zeros ((n , n), f8 )8 @jit ( argtypes =[ float64 [: ,:]])9 def aom (a ):10 for i in range (n ):11 for j in range (n ):12 a[i ,j ] = i +j13 aom (a )14 t2 = time ()15 print t2 - t1 Lemma UFPR
  26. 26. 10 . . . e mais uma:1 # !/ usr / bin / python2 from numpy import arange , array , int32 , zeros3 from time import time4 from numba import jit , float645 n = 50006 t1 = time ()7 a = zeros ((n , n), f8 )8 @jit ( argtypes =[ float64 [: ,:]])9 def aom (a ):10 for i in range (n ):11 for j in range (n ):12 a[i ,j ] = i +j13 aom (a )14 t2 = time ()15 print t2 - t1 ./ cacumij . py 0.290515899658 Lemma UFPR
  27. 27. 11 Conclusões desta parte• Um bom conhecimento dos detalhes de uma linguagem (no caso, como Fortran armazena matrizes) é muitas vezes necessário para otimizar um programa.• A ordem em que uma matriz é percorrida (ij, ji) importa muito, porque a CPU é muito mais rápida do que qualquer memória. A diferença de velocidade está aumentando: a tecnologia está tornando as CPUs relativamente mais e mais rápidas que as memórias.• Depois de otimizado, Fortran ainda é (neste exemplo) 33% mais rápido.• No entanto, obtivemos a mesma ordem de grandeza de tempo de CPU com Python, de duas maneiras diferentes (sem e com numba).• Compiladores “just in time” (numba) estão chegando próximos do desempenho de Fortran. Lemma UFPR
  28. 28. 12 O efeito que BLAS faz. . .BLAS = Basic Linear Algebra Subprograms.BLAS é um conjunto altamente otimizado de rotinas para realizar operações deálgebra linear.Existem hoje em dia várias implementações (http://en.wikipedia.org/wiki/Basic_Linear_Algebra_Subprograms):Accelerate, ACML, C++ AMP BLAS, ATLAS, ESSL, Eigen BLAS, Goto BLAS, HPMLIB, Intel MKL, MathKeisan, Netlib BLAS, Netlib CBLAS, PDLIB/SX, SCSL, SunPerformance Library, SurviveGotoBLAS2, OpenBLAS, cuBLAS,Em Linux: é relativamente fácil instalar um BLAS pré-compilado (nunca tão bomquanto compilar e ajustar para a própria máquina). Minha escolha: ATLAS.Em Windows: um pequeno pesadelo, se não houver um compilador comercial deFortran. Minha escolha: MingGW (compilador C e Fortran) + OpenBLAS. Lemma UFPR
  29. 29. 13 Produto de 2 matrizes em Fortran:1 program cabum2 integer , parameter :: size = 10003 real ( kind =8) :: a( size , size ), b( size , size ), c( size , size )4 integer ( kind =4) :: seed5 call random_seed ()6 call random_number (a )7 call random_number (b )8 call cpu_time ( t1 )9 c = matmul (a , b)10 call cpu_time ( t2 )11 write (* ,*) t2 - t112 end program Lemma UFPR
  30. 30. 13 Produto de 2 matrizes em Fortran:1 program cabum2 integer , parameter :: size = 10003 real ( kind =8) :: a( size , size ), b( size , size ), c( size , size )4 integer ( kind =4) :: seed5 call random_seed ()6 call random_number (a )7 call random_number (b )8 call cpu_time ( t1 )9 c = matmul (a , b)10 call cpu_time ( t2 )11 write (* ,*) t2 - t112 end program sem BLAS: gfortran - o3 cabum . f90 -o cabum - noblas ./ cabum - noblas ; 1.62810099 Lemma UFPR
  31. 31. 13 Produto de 2 matrizes em Fortran:1 program cabum2 integer , parameter :: size = 10003 real ( kind =8) :: a( size , size ), b( size , size ), c( size , size )4 integer ( kind =4) :: seed5 call random_seed ()6 call random_number (a )7 call random_number (b )8 call cpu_time ( t1 )9 c = matmul (a , b)10 call cpu_time ( t2 )11 write (* ,*) t2 - t112 end program sem BLAS: gfortran - o3 cabum . f90 -o cabum - noblas ./ cabum - noblas ; 1.62810099 com BLAS: gfortran - o3 - fexternal - blas cabum . f90 - lblas -o cabum - blas ./ cabum - blas ; 0.300018996 Lemma UFPR
  32. 32. 14 Produto de 2 matrizes em Python/Numpy:1 # !/ usr / bin / python2 import numpy3 n = 10004 a = numpy . random . rand (n ,n )5 b = numpy . random . rand (n ,n )6 from time import time7 t1 = time ()8 c = numpy . dot (a , b)9 t2 = time ()10 print t2 - t1 Lemma UFPR
  33. 33. 14 Produto de 2 matrizes em Python/Numpy:1 # !/ usr / bin / python2 import numpy3 n = 10004 a = numpy . random . rand (n ,n )5 b = numpy . random . rand (n ,n )6 from time import time7 t1 = time ()8 c = numpy . dot (a , b)9 t2 = time ()10 print t2 - t1 ./ cabum . py 0.295262813568 Lemma UFPR
  34. 34. 15 Conclusões, com BLAS• BLAS faz toda a diferença: não saia de casa sem ele. Lemma UFPR
  35. 35. 15 Conclusões, com BLAS• BLAS faz toda a diferença: não saia de casa sem ele.• BLAS torna um programa Fortran otimizado para multiplicar matrizes 6 vezes mais rápido. Lemma UFPR
  36. 36. 15 Conclusões, com BLAS• BLAS faz toda a diferença: não saia de casa sem ele.• BLAS torna um programa Fortran otimizado para multiplicar matrizes 6 vezes mais rápido.• Numpy tira toda a vantagem possível de BLAS: neste exemplo Python/Numpy é ligeiramente mais rápido que Fortran. Lemma UFPR
  37. 37. 15 Conclusões, com BLAS• BLAS faz toda a diferença: não saia de casa sem ele.• BLAS torna um programa Fortran otimizado para multiplicar matrizes 6 vezes mais rápido.• Numpy tira toda a vantagem possível de BLAS: neste exemplo Python/Numpy é ligeiramente mais rápido que Fortran.• Com esforço suficiente (opções de compilação, BLAS compilado para a má- quina, etc.) deve ser possível tornar Fortran mais rápido que Python/Numpy. Lemma UFPR
  38. 38. 16 III: Rodando em WindowsPor que desenvolver para Windows? Lemma UFPR
  39. 39. 16 III: Rodando em WindowsPor que desenvolver para Windows?Porque muitos não têm acesso a Linux. Lemma UFPR
  40. 40. 16 III: Rodando em WindowsPor que desenvolver para Windows?Porque muitos não têm acesso a Linux.Como ter Fortran/BLAS gratuitamente em Windows:• Obtenha e instale MingGW www.mingw.org• Dentro do shell de MingGW, obtenha e instale wget: mingw-get install wget• Obtenha OpenBLAS http://xianyi.github.com/OpenBLAS/• Desempacote na pasta c:mingwmsys1.0OpenBLAS• Nesta pasta (cd /OpenBLAS/): – ./quickbuild.win32 – Espere uma eternidade (muitas horas ou uma noite inteira) – make install /mingw (deve copiar libopenblas.lib para c:mingwlib)• Copie libopenblas.dll para alguma pasta no PATH (por exemplo, c:mingwbin) Lemma UFPR
  41. 41. 17 Dentro de um prompt de Windows7Rodando dentro de uma máquina virtual (Virtual Box) Windows7gfortran - o3 cacumij . f90 -o cacumij . execacumij1.5822750gfortran - o3 cacumji . f90 -o cacumji . exe0.85122401gfortran - o3 cabum . f90 -o cabum - noblas . execabum - noblas1.7925980gfortran - fexternal - blas - o3 cabum . f90 - lopenblas -o cabum - blas . exe0.26037401cabum . py0.501000165939 Lemma UFPR
  42. 42. 18 Conclusões desta parte• Não há numba em meu Windows7; portanto, não há comparação com cacumij.py.• Os tempos de máquina dependem dos processos rodando em todo o sistema operacional anfitrião (Linux); portanto, as comparações são aproximadas e de- pendem do estado do sistema.• Os tempos em Windows são comparáveis com os tempos em Linux: depen- dendo do caso, Fortran ou Python podem “ganhar” entre si ou entre sistemas operacionais diferentes. Lemma UFPR
  43. 43. 19 Conclusões gerais• Não é possível ainda prescindir totalmente de Fortran ou C: vale a pena man- ter compiladores atualizados em todos os sistemas operacionais em que for necessário trabalhar.• Fortran sem BLAS não é competitivo com Python/Numpy, todas as vezes em que operações vetoriais e matriciais forem uma parte significativa (em tempo de máquina) do programa.• Portanto, é fundamental possuir BLAS no sistema, tão otimizado quanto possí- vel.• Python/Numpy/Numba possuem desempenho comparável a Fortran, pelo me- nos em ordem de grandeza (digamos, entre 50% e 100% da velocidade de Fortran). Lemma UFPR
  44. 44. 19 Conclusões gerais• Não é possível ainda prescindir totalmente de Fortran ou C: vale a pena man- ter compiladores atualizados em todos os sistemas operacionais em que for necessário trabalhar.• Fortran sem BLAS não é competitivo com Python/Numpy, todas as vezes em que operações vetoriais e matriciais forem uma parte significativa (em tempo de máquina) do programa.• Portanto, é fundamental possuir BLAS no sistema, tão otimizado quanto possí- vel.• Python/Numpy/Numba possuem desempenho comparável a Fortran, pelo me- nos em ordem de grandeza (digamos, entre 50% e 100% da velocidade de Fortran). Tenha a sabedoria de escolher as melhores ferramentas. Lemma UFPR
  45. 45. 20 Thanks!LemmaUFPR

×