Fortran ve LAPACK kullanarak gerçek bir simetrik matrisin üçgenini çizmek istiyorum. LAPACK temel olarak bir tanesi tam matriste, diğeri ise paketlenmiş depolamada matris üzerinde çalışan iki rutini sağlar. İkincisi, daha az bellek kullanıyor olsa da, hız farkı hakkında bir şey söylenebilir mi diye merak ediyordum?LAPACK: Paketlenmiş depolama alanlarındaki işlemler daha hızlı mı?
cevap
Elbette ampirik bir soru: ama genel olarak, hiçbir şey bedavaya gelir ve daha az bellek/daha fazla çalışma zamanı oldukça yaygın bir tradeofftur.
Bu durumda, verilerin dizine eklenmesi paketlenmiş durum için daha karmaşıktır, böylece matrisi geçtiğinizde verilerinizi alma maliyeti biraz daha yüksektir. (Bu resmi karmaşıklaştırmak, simetrik matrisler için, lapack rutinlerinin de belirli bir ambalaj türünü almasıdır - sadece matrisin üst veya alt bileşenini kullanabilirsiniz).
Bugün bir eigenproblem ile uğraşıyordum, bu yüzden bunu bir ölçüm kriteri olarak kullanacağım; Basit bir simetrik test durumunda (http://people.sc.fsu.edu/~jburkardt/m_src/test_mat/test_mat.html den Herdon matrisi) ile çalışırken, ve itiraf gereken yaklaşık% 18'lik bir fark vardır sspevd
$ ./eigen2 500
Generating a Herdon matrix:
Unpacked array:
Eigenvalues L_infty err = 1.7881393E-06
Packed array:
Eigenvalues L_infty err = 3.0994415E-06
Packed time: 2.800000086426735E-002
Unpacked time: 2.500000037252903E-002
$ ./eigen2 1000
Generating a Herdon matrix:
Unpacked array:
Eigenvalues L_infty err = 4.5299530E-06
Packed array:
Eigenvalues L_infty err = 5.8412552E-06
Packed time: 0.193900004029274
Unpacked time: 0.165000006556511
$ ./eigen2 2500
Generating a Herdon matrix:
Unpacked array:
Eigenvalues L_infty err = 6.1988831E-06
Packed array:
Eigenvalues L_infty err = 8.4638596E-06
Packed time: 3.21040010452271
Unpacked time: 2.70149993896484
ile ssyevd
karşılaştırılması da biraz daha büyük (I beklenenden daha büyük paketlenmiş durumda hata?). Bu intel'in MKL'si. Performans farkı genel olarak matrisinize bağlı olacaktır, elbette eriktous'un işaret ettiği gibi, ve yaptığınız problemde; Yapmanız gereken matrise daha rastgele erişim, daha da kötüsü olurdu. Kullandığım kod şu şekildedir:
program eigens
implicit none
integer :: nargs,n ! problem size
real, dimension(:,:), allocatable :: A, B, Z
real, dimension(:), allocatable :: PA
real, dimension(:), allocatable :: work
integer, dimension(:), allocatable :: iwork
real, dimension(:), allocatable :: eigenvals, expected
real :: c, p
integer :: worksize, iworksize
character(len=100) :: nstr
integer :: unpackedclock, packedclock
double precision :: unpackedtime, packedtime
integer :: i,j,info
! get filename
nargs = command_argument_count()
if (nargs /= 1) then
print *,'Usage: eigen2 n'
print *,' Where n = size of array'
stop
endif
call get_command_argument(1, nstr)
read(nstr,'(I)') n
if (n < 4 .or. n > 25000) then
print *, 'Invalid n ', nstr
stop
endif
! Initialize local arrays
allocate(A(n,n),B(n,n))
allocate(eigenvals(n))
! calculate the matrix - unpacked
print *, 'Generating a Herdon matrix: '
A = 0.
c = (1.*n * (1.*n + 1.) * (2.*n - 5.))/6.
forall (i=1:n-1,j=1:n-1)
A(i,j) = -1.*i*j/c
endforall
forall (i=1:n-1)
A(i,i) = (c - 1.*i*i)/c
A(i,n) = 1.*i/c
endforall
forall (j=1:n-1)
A(n,j) = 1.*j/c
endforall
A(n,n) = -1./c
B = A
! expected eigenvalues
allocate(expected(n))
p = 3. + sqrt((4. * n - 3.) * (n - 1.)*3./(n+1.))
expected(1) = p/(n*(5.-2.*n))
expected(2) = 6./(p*(n+1.))
expected(3:n) = 1.
print *, 'Unpacked array:'
allocate(work(1),iwork(1))
call ssyevd('N','U',n,A,n,eigenvals,work,-1,iwork,-1,info)
worksize = int(work(1))
iworksize = int(work(1))
deallocate(work,iwork)
allocate(work(worksize),iwork(iworksize))
call tick(unpackedclock)
call ssyevd('N','U',n,A,n,eigenvals,work,worksize,iwork,iworksize,info)
unpackedtime = tock(unpackedclock)
deallocate(work,iwork)
if (info /= 0) then
print *, 'Error -- info = ', info
endif
print *,'Eigenvalues L_infty err = ', maxval(eigenvals-expected)
! pack array
print *, 'Packed array:'
allocate(PA(n*(n+1)/2))
allocate(Z(n,n))
do i=1,n
do j=i,n
PA(i+(j-1)*j/2) = B(i,j)
enddo
enddo
allocate(work(1),iwork(1))
call sspevd('N','U',n,PA,eigenvals,Z,n,work,-1,iwork,-1,info)
worksize = int(work(1))
iworksize = iwork(1)
deallocate(work,iwork)
allocate(work(worksize),iwork(iworksize))
call tick(packedclock)
call sspevd('N','U',n,PA,eigenvals,Z,n,work,worksize,iwork,iworksize,info)
packedtime = tock(packedclock)
deallocate(work,iwork)
deallocate(Z,A,B,PA)
if (info /= 0) then
print *, 'Error -- info = ', info
endif
print *,'Eigenvalues L_infty err = ', &
maxval(eigenvals-expected)
deallocate(eigenvals, expected)
print *,'Packed time: ', packedtime
print *,'Unpacked time: ', unpackedtime
contains
subroutine tick(t)
integer, intent(OUT) :: t
call system_clock(t)
end subroutine tick
! returns time in seconds from now to time described by t
real function tock(t)
integer, intent(in) :: t
integer :: now, clock_rate
call system_clock(now,clock_rate)
tock = real(now - t)/real(clock_rate)
end function tock
end program eigens
- 1. Bileşenler şablonlara göre daha hızlı mı?
- 2. CLucene, java lucene'den daha hızlı mı?
- 3. nümerik verilerden cPickle'den daha hızlı mı?
- 4. divmod()% ve // operatörlerini kullanmaktan daha mı hızlı?
- 5. getattr() dict aramasına karşı daha hızlı mı?
- 6. `extend` `+ =` dan daha hızlı mı? python'da
- 7. ImageMagick'den daha hızlı bir şey var mı?
- 8. Yazma, x86'da okunandan daha hızlı mı?
- 9. MongoDB Saklanan JavaScript Prosedürleri daha hızlı mı?
- 10. SELECT sorgusuna daha fazla özgüllük eklemek daha hızlı mı?
- 11. MySQL byte-for-byte karşılaştırması daha mı hızlı? bin_collate
- 12. F # 1.9.9.9 ve lapack
- 13. daha hızlı yolu?
- 14. JODCONVERTER'den daha hızlı
- 15. Daha hızlı geçirgenlik oluşturucu
- 16. Daha hızlı Android geliştirme
- 17. Daha hızlı kaydırma etkinliği? -
- 18. neden daha hızlı döngü
- 19. C++/CLI daha hızlı C#
- 20. Daha hızlı gelişme için IDE
- 21. Neden plt.pcolor'dan çok daha hızlı görünüyor?
- 22. HttpHandlers'den daha hızlı bir şey?
- 23. FTP'den daha hızlı dosya aktarımı
- 24. Ruby's Dir.glob'a daha hızlı bir alternatif var mı?
- 25. Java'da BufferedImage pikselleri arasında daha hızlı yineleme yöntemi var mı?
- 26. BigQuery'ye doğrudan Cloud Storage'a yüklemekten daha hızlı mı yükleniyor?
- 27. "scipy.misc.comb" ad hoc bir binom hesaplamasından daha mı hızlı?
- 28. Android geliştirme, C/C++ Java'dan daha hızlı mı?
- 29. Etkin pencere varsa bir görev daha hızlı tamamlanacak mı?
- 30. NET'te, gerekli olmasa bile Öznitelik sonekini kullanmak daha hızlı mı?
Bu konuda bir uzmantan çok uzaktayım, ama benim tahminim cevabın "bağlı" olması. Çoğunlukla matrisin yapısı (sparsity miktarı). – eriktous