Tôi đã triển khai CG trong FORTRAN bằng cách liên kết nó với Intel MKL.
Khi có các câu như: ( Tham khảo Wikipedia )
p=r;
x=x+alpha*p
r=r-alpha*Ap;
hoặc những cái tương tự trong QMR (với số lượng lớn hơn nhiều)
v_tld = r;
y = v_tld;
rho = norm( y );
w_tld = r;
z = w_tld;
xi = norm( z ); (and more)
Có ý nghĩa gì khi sử dụng các triển khai BLAS Cấp 1 như DAXPY, DCOPY, DSCAL không? Động lực cho câu hỏi của tôi là:
Tôi có 2 triển khai các thuật toán. Một trong đó tôi chỉ liên kết các Norm và MatVec với MKL; sao chép, chia tỷ lệ và thêm được thực hiện bởi các chức năng nội tại của Fortran và một chức năng khác trong đó mọi chương trình con có thể được BLAS thực hiện.
Tôi đã có quan niệm rằng không có gì có thể nhanh hơn BLAS. Nhưng, hóa ra mã của tôi sử dụng các hàm nội tại của Fortran đã chạy nhanh hơn 100% so với mã có chương trình con BLAS Cấp 1 (FWIW, Đây không phải là một vấn đề nhỏ, nó đã giải quyết được một hệ thống dày đặc có kích thước 13k x 13k. RAM GB). Tôi đã chạy cả hai luồng (trên máy 2 lõi)
ifort QMR.f90 -mkl
vớiMKL_DYNAMIC=TRUE
Tôi đã hỏi một câu hỏi về SO liên quan đến việc mở rộng BLAS nhưng khi tôi cố gắng đưa BLAS Cấp 1 vào mã của mình, mã của tôi càng ngày càng chậm.
Tôi đang làm gì đó sai hay điều này được mong đợi?
Ngoài ra, có ý nghĩa gì khi thử mở rộng BLAS để thực hiện các hoạt động không rõ ràng như y = 2.89*x
bằng DCOPY(n,2.89*x,1,y,1) or even DSCAL then DCOPY
?
Điều cũng thú vị là, DDOT
và DNRM2
cải thiện hiệu suất. Tôi cho rằng thực tế là vì chúng thực hiện phép nhân chính xác gấp đôi, đặt chúng song song có thể giúp ích.
Câu hỏi bổ sung: Khi nào bạn quyết định liệu hoạt động BLAS Cấp 1 có thực sự hỗ trợ hiệu suất không?
Thêm: Hiện tại, tôi đang chạy trên Máy tính xách tay i3 2,13 GHz với RAM 4 GB và thông tin Proc 64 bit Debian tại đây . Nhưng, tôi nhận được câu trả lời tương tự trên máy trạm Intel Xeon 12 lõi với RAM 24 GB.