Phần 4: CUDA – Cài đặt cho Fortran
NVIDIA phối hợp cùng PGI (Portland Group) cuối cùng đã cho ra Fortran compiler với CUDA support. Trước đây, CUDA support chỉ có trên C/C++ programming language. Hiện nay hầu hết các code chương trình cho khoa học là viết trên Forrtran, vì thế, nhu cầu chuyển dần sang CUDA-enabled Tesla NVIDIA GPU là rất lớn.
Đăng kí bản quyền
Để dùng được PGI Fortran, bạn cần có file license.dat, ở đây tôi không đi vào chi tiết cài đặt. Tuy nhiên, đây là bước đầu tiên và chỉ làm 1 lần.
Kích hoạt CUDA + accelerator compiler
Kể từ phiên bản 9.0-4, PGI Fortran hỗ trợ CUDA features (tuy chưa đầy đủ). Để kích hoạt, bạn cần tạo ra 1 file có tên sitenvrc để khai báo các thư mục cài đặt CUDA software. File này nằm ở thư mục $PGI/linux86-64/9.0-4/bin (CHÚ Ý: $PGI là alias đến thư mục cài đặt PGI, ví dụ: $PGI=/opt/pgi, hay $PGI=/usr/pgi, tuỳ theo version của PGI Fortran mà 9.0-1 có thể phải đổi thành 9.0-2 hay khác).
Sau đó, thêm các dòng sau vào trong file sitenvrc (chú ý dấu chấm phẩy sau mỗi hàng là quan trọng)
set NVOPEN64DIR=/opt/cuda/open64/lib; set CUDADIR=/opt/cuda/bin; set CUDALIB=/opt/cuda/lib64; ! thay lib64 bằng lib nếu là CUDA 2.2 set GCCVERSION=40301; ! có một số không tương thích giữa G++4.3 với NVIDIA installation files
Dòng thứ 4 là cần thiết nếu gặp lỗi:
/usr/include/c++/4.3/x86_64-linux-gnu/bits/c++config.h(233): error: expected a “{”….
Để kiểm tra cài đặt thành công, với CUDA, bạn có thể test với deviceQuery hay bandwidthTest (nằm trong bộ CUDA SDK samples), hoặc pgaccelinfo tool. Với pgaccelinfo, thông tin gồm
Device Number: 2 Device Name: Tesla C1060 Device Revision Number: 1.3 Global Memory Size: 4294705152 Number of Multiprocessors: 30 Number of Cores: 240 Concurrent Copy and Execution: Yes Total Constant Memory: 65536 Total Shared Memory per Block: 16384 Registers per Block: 16384 Warp Size: 32 Maximum Threads per Block: 512 Maximum Block Dimensions: 512 x 512 x 64 Maximum Grid Dimensions: 65535 x 65535 x 1 Maximum Memory Pitch: 262144B Texture Alignment 256B Clock Rate: 1296 MHz Initialization time: 3376 microseconds Current free memory 4246142976 Upload time (4MB) 1091 microseconds ( 908 ms pinned) Download time 1545 microseconds (1365 ms pinned) Upload bandwidth 3844 MB/sec (4619 MB/sec pinned) Download bandwidth 2714 MB/sec (3072 MB/sec pinned)
Chú ý, các thế hệ NVIDIA GPU khác nhau có khả năng tính toán khác nhau. Chúng được thể hiện qua cái gọi là “Compute Capability” (C.C), đãi diện bởi 2 chữ số. Hiện nay có 3 phiên bản: 1.0, 1.1, và 1.3. Tesla Carg C1060 hỗ trợ C.C. 1.3.
Nếu bạn muốn compile ra CUDA code để có thể chạy trên các NVIDIA Card thấp hơn, ví dụ C.C. 1.0, ta thêm vào một dòng khác trong file sitenvrc
set COMPUTECAP=1.0
Biên dịch với pgf95
Để biên dịch ra code chạy được trên PGPGU
- using GPU Programming model CUDA, ta du’ng compiler flag “-Mcuda” (không có dấu ngoặc kép)
- using Accelerator Programming model (sẽ đề cập ở bài viết khác), ta du’ng compiler flag “-ta=nvidia” (không có dấu ngoặc kép)
Another way to edit the file sitenvrc
set NVDIR=/usr/local/cuda;
set NVOPEN64DIR=$NVDIR/open64/lib;
set CUDADIR=$NVDIR/bin;
set CUDALIB=$NVDIR/lib64;
set GCCVERSION=40303;
Tham khảo: