2010-04-30 27 views
6

Tôi tự hỏi về Thư viện cuBLAS của NVIDIA. Có ai có kinh nghiệm với nó không? Ví dụ: nếu tôi viết chương trình C bằng BLAS, tôi có thể thay thế cuộc gọi đến BLAS bằng các cuộc gọi đến cuBLAS không? Hoặc thậm chí còn thực hiện tốt hơn một cơ chế mà cho phép người dùng chọn trong thời gian chạy?BLAS và CUBLAS

Còn nếu tôi sử dụng Thư viện BLAS do Boost cung cấp với C++ thì sao?

Trả lời

1

CUBLAS không quấn quanh BLAS. CUBLAS cũng truy cập ma trận theo thứ tự cột lớn, chẳng hạn như một số mã Fortran và BLAS.

Tôi quen với việc viết mã bằng C, ngay cả đối với CUDA. Một mã được viết bằng CBLAS (một gói C của BLAS) có thể dễ dàng được thay đổi thành mã CUDA. Lưu ý rằng các mã Fortran sử dụng BLAS khá khác với các mã C/C++ sử dụng CBLAS. Fortran và BLAS thường lưu trữ ma trận hoặc mảng kép trong thứ tự cột lớn, nhưng C/C++ thường xử lý thứ tự hàng lớn. tôi thường xử lý vấn đề này bằng văn bản tiết kiệm các ma trận trong một mảng 1D, và sử dụng #define để viết một macro truy cập toa các yếu tố i, j của một ma trận như:

/* define macro to access Aij in the row-wise array A[M*N] */ 
#define indrow(ii,jj,N) (ii-1)*N+jj-1 /* does not depend on rows M */ 
/* define macro to access Aij in the col-wise array A[M*N] */ 
#define indcol(ii,jj,M) (jj-1)*M+ii-1 

CBLAS thư viện có một tổ chức tốt các thông số và các quy ước (biến const enum) để cung cấp cho mỗi chức năng thứ tự của ma trận. Hãy coi chừng rằng việc lưu trữ các ma trận khác nhau, một ma trận dải được xếp hàng khôn ngoan không được lưu trữ giống như ma trận băng thông cột.

Tôi không nghĩ rằng có cơ chế để cho phép người dùng lựa chọn giữa việc sử dụng BLAS hoặc CUBLAS, mà không cần viết mã hai lần. CUBLAS cũng có trên hầu hết các cuộc gọi hàm một biến "xử lý" không xuất hiện trên BLAS. Tôi mặc dù #define để thay đổi tên tại mỗi cuộc gọi chức năng, nhưng điều này có thể không hoạt động.

0

Tôi đã chuyển mã BLAS sang CUBLAS. Thư viện BLAS mà tôi sử dụng là ATLAS, vì vậy những gì tôi nói có thể chỉ đúng với lựa chọn thư viện BLAS.

ATLAS BLAS yêu cầu bạn chỉ định nếu bạn đang sử dụng thứ tự cột chính hoặc thứ tự hàng lớn và tôi đã chọn thứ tự cột lớn vì tôi đang sử dụng CLAPACK sử dụng thứ tự cột lớn. Mặt khác LAPACKE sẽ sử dụng thứ tự hàng lớn. CUBLAS là thứ tự cột chính. Bạn có thể cần phải điều chỉnh cho phù hợp.

Ngay cả khi đặt hàng không phải là vấn đề khi chuyển sang CUBLAS thì không có nghĩa là thay thế giảm. Vấn đề lớn nhất là bạn phải di chuyển dữ liệu vào và ra khỏi không gian bộ nhớ của GPU. Bộ nhớ đó được thiết lập bằng cách sử dụng cudaMalloc() và được phát hành với cudaFree() hoạt động như một người có thể mong đợi. Bạn di chuyển dữ liệu vào bộ nhớ GPU bằng cudaMemcpy(). Thời gian để làm điều này sẽ là một yếu tố quyết định lớn nếu nó đáng giá để di chuyển từ CPU sang GPU.

Tuy nhiên, khi thực hiện xong, các cuộc gọi tương đối giống nhau. CblasNoTrans trở thành CUBLAS_OP_N và CblasTrans trở thành CUBLAS_OP_T. Nếu thư viện BLAS của bạn (như ATLAS) cho phép bạn vượt qua vô hướng theo giá trị, bạn sẽ phải chuyển đổi số đó để chuyển qua tham chiếu (như bình thường cho FORTRAN).

Với điều này, bất kỳ chuyển đổi nào cho phép lựa chọn CPU/GPU sẽ dễ dàng ở mức cao hơn trong hàm sử dụng BLAS. Trong trường hợp của tôi, tôi có các biến thể CPU và GPU của thuật toán và chọn chúng ở mức cao hơn tùy thuộc vào kích thước của sự cố.

5

Câu trả lời của janneb không chính xác, cuBLAS là không phải là thay thế thả cho BLAS CPU. Nó giả định rằng dữ liệu đã có trên thiết bị và các chữ ký hàm có một tham số phụ để theo dõi một ngữ cảnh cuBLAS.

Tuy nhiên, đến trong CUDA 6.0 là một thư viện mới có tên NVBLAS cung cấp chính xác chức năng "thả" này. Nó ngăn chặn các cuộc gọi BLAS cấp 3 (GEMM, TRSV, v.v.) và tự động gửi chúng tới GPU, hiệu quả trong việc truyền tải PCIE với tính toán trên GPU.

Có một số thông tin ở đây: https://developer.nvidia.com/cublasxt và CUDA 6.0 có sẵn cho nhà phát triển đã đăng ký CUDA ngay hôm nay.

Tài liệu đầy đủ sẽ trực tuyến khi CUDA 6.0 được phát hành cho công chúng.

Các vấn đề liên quan