Là DAXPY, DCOPY, DSCAL quá mức cần thiết?


8

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à:

  1. 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.

  2. 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 -mklvớiMKL_DYNAMIC=TRUE

  3. 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*xbằng DCOPY(n,2.89*x,1,y,1) or even DSCAL then DCOPY?


Điều cũng thú vị là, DDOTDNRM2cả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.


Bạn đang chạy trên phần cứng nào?
Pedro

2
Đừng cho rằng không có gì nhanh hơn BLAS / LAPACK. Chúng được tối ưu hóa cho tiện ích, không nhất thiết là tốc độ giành huy chương vàng. Khi tốc độ là nhu cầu của bạn, bạn có thể thử điều này .
Mike Dunlavey

DCOPY (n, 2.89 * x, 1, y, 1) sẽ không làm những gì bạn muốn. Nó thẳng lên sai rồi. Chức năng bạn muốn là DAXPY.
Jeff

MKL_DYNAMIC = TRUE là khủng khiếp cho hiệu suất. Tôi biết không có mã khoa học nào được hưởng lợi từ điều này. Tắt nó đi và đặt số luồng qua MKL_NUM_THREADS / OMP_NUM_THREADS và bật OMP_SCHEDULE = STATIC.
Jeff

Câu trả lời:


6

Nếu mục tiêu của bạn thực sự là vắt kiệt càng nhiều hiệu suất càng tốt, thì điều quan trọng cần nhớ là:

  1. Thư viện (BLAS) có thể chưa được điều chỉnh cho hệ thống / cấu hình chính xác của bạn.
  2. Các nhà phát triển thư viện mắc lỗi.

Một thư viện BLAS do nhà cung cấp điều chỉnh chắc chắn phải là cách tiếp cận mặc định của bạn, nhưng nếu bạn đã dành thời gian để sử dụng các hạt nhân riêng lẻ và nhận thấy rằng một số cách thực hiện khác nhanh hơn, thì, bằng mọi cách, hãy sử dụng cách thực hiện khác. Bỏ lỡ việc sử dụng nội tại vector có thể dẫn đến sự khác biệt hiệu suất lớn.

Có thể là đặt cược tốt nhất của bạn cho các thói quen đơn giản như daxpydscal là một vòng lặp viết tay khai thác nội tại vector.


Mặc dù tôi không thể bác bỏ một cách hợp lý (2), tôi không tin rằng nó thích hợp ở đây. DCOPY, DSCAL và DAXPY gần như không đáng để thực hiện đúng, do đó tôi nghi ngờ mọi người mắc lỗi. Vấn đề là sự tầm thường của chúng xuất phát từ thực tế là các chức năng này đạt đến giới hạn phần cứng rất nhanh và do đó rất ít tối ưu hóa có hiệu quả.
Jeff

3

Căn cứ vào tình trạng tối ưu hóa trình biên dịch bây giờ một ngày, tôi không nghĩ rằng có nhiều voodoo trong BLAS thói quen tuyến tính, ví dụ DAXPY, DCOPYDSCAL, rằng trình biên dịch của bạn sẽ không làm rồi, ví dụ như SSE-vector hóa và vòng lặp unrolling.

Nếu mã giống nhau, sự khác biệt duy nhất giữa thói quen của bạn và cuộc gọi đến BLAS của MKL là chi phí hoạt động của cuộc gọi chức năng và bất kỳ phép thuật bổ sung nào MKL có thể đang cố gắng thực hiện ở đó. Nếu đây là trường hợp, sự khác biệt giữa mã của bạn và mã MKL phải là một hằng số, không phụ thuộc vào kích thước của vấn đề / vectơ.

Câu hỏi này có tiếng vang thú vị của câu hỏi này , cũng DAXPYlà một ví dụ.


2

Tiêu chuẩn BLAS thực sự có một số kiểm tra về tính chính xác của các đối số chức năng không cần thiết trong nhiều tình huống. Xem tài liệu tham khảo này thực hiện daxpy.f. Ngoài ra, các hằng số như INCXthường được biết đến với bạn tại thời gian biên dịch, nhưng có thể không được giả định khi triển khai. BLAS gọi các đơn vị biên dịch chéo và tôi không biết bất kỳ trình biên dịch nào sẽ có thể tối ưu hóa các trình biên dịch này mà không cần bật tối ưu hóa toàn bộ chương trình.

  • Một điều thú vị nữa là Intel Compiler hiện nhận ra các vòng lặp ma trận ma trận BLAS 3 và sẽ chuyển đổi mã này thành cuộc gọi x tương đương gemm, với đủ khả năng tối ưu hóa.

Bạn đã chạy thử nghiệm trong đó bạn loại bỏ các điều kiện trong DAXPY để xem liệu điều đó có ảnh hưởng gì đến hiệu suất không? Tôi nghiêm túc nghi ngờ nó làm.
Jeff

Không, nhưng tôi đã viết mã lắp ráp thuần túy và vượt trội hơn DAXPY do nhà cung cấp cung cấp trong BLAS trên một vài nền tảng :)
Aron Ahmadia

1

Các hàm BLAS1 đại diện cho một tập hợp các hạt nhân bị giới hạn băng thông vì cường độ tính toán của chúng thấp. Đặc biệt, các hạt nhân này làm O (1) flops cho mỗi lần truy cập bộ nhớ. Điều này có nghĩa là trên phần cứng hiện đại, chúng chạy ở một phần nhỏ của cực đại và về cơ bản không có gì bạn có thể làm. Việc triển khai tốt nhất BLAS1 sẽ kiểm tra căn chỉnh và điều chỉnh độ dài vectơ FPU và thực hiện ở mức băng thông cao nhất, có khả năng là 5-10% của đỉnh tính toán.

Khi bạn viết các hoạt động này một cách rõ ràng trong nguồn, một trình biên dịch tốt sẽ ngay lập tức nhận ra chúng và đưa ra một số triển khai tối ưu tương đương với BLAS1 đã lưu ý ở trên. Tuy nhiên, vì trình biên dịch biết nhiều hơn về ngữ cảnh, nó có thể tránh một số nhánh nhất định (không phải là vấn đề đó nhiều) và chức năng gọi qua đầu, cũng như có khả năng thực hiện các phép biến đổi bậc cao hơn trong mã sẽ bị chặn bởi lệnh gọi hàm một thư viện mờ đục.

Có nhiều thử nghiệm bạn có thể thực hiện để xác định điều gì thực sự ảnh hưởng đến hiệu suất mã của bạn. Chúng khá rõ ràng nên tôi sẽ không liệt kê chúng ở đây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.