Cuda
Hướng Dẫn Cách Thiết Lập Dự Án CUDA Ngo Quoc Vinh Kyoto – Japan 2008 1. Cấu hình phần cứng và phần mềm cần thiết • ðịnh nghĩa: CUDA nghĩa là Compute Unified Device Architecture là 1 kiến trúc phần mềm và phần cứng cho mục ñích phát triển tính toán trên GPU. Trong hệ thống ña nhiệm việc sử dụng GPU trong việc tính toán (Lập trình CUDA) và ñồ họa có thể xảy ra ñồng thời. • Phần mềm cần thiết: Cuda SDK version2.0 có thể dùng cho windows XP 32-bit hoặc 64-bit. Trong windows bạn cần sử dụng chương trình Microsoft Visual C++ 2005 ñể viết 1 dự án CUDA • Phần cứng cần thiết: ðể viết 1 chương trình CUDA, ngoài các phần mểm hổ trợ ta cần có phần cứng ñể chương trình hoạt ñộng (không phải chế ñộ mô phỏng) Các thiết bị phần cứng ñược NVIDIA hỗ trợ trong lập trình cuda, có thể tham khảo tai site: http://www.nvidia.com/object/cuda_learn_products.html (trong trường hợp trên chì sừ dụng 1 graphics card nếu ñược bạn có thể sử dụng nhiều hơn 1 graphics card). • Tham khảo: Tại site này có thể tham khảo các tài liệu lien quan ñến cuda sử dụng tiếng anh http://forums.nvidia.com/index.php?showtopic=36286 Tại site này có thể tham khảo các tài liệu lien quan ñến cuda sử dụng tiếng nhật http://www.nvidia.co.jp/object/cuda_home_jp.html. 2. Cách cài ñặt CUDA driver, CUDA tool kit và cuda SDK ðể 1 chương trình cuda hoạt ñộng ñược trong môi trường windows xp. Bạn cần phải có các thư viện hỗ trợ. Các thư viện này ñược chứa trong bộ SDK do NVIDIA cung cấp. • Cách download CUDA driver Driver ñược download từ http://www.nvidia.com/object/cuda_get.html#windows tương ứng với số serial của card. Nếu ñùng tiếng nhật bạn có thể download tại site: http://www.nvidia.co.jp/object/cuda_get_jp.html#windows Trong site này bạn chọn vào mục “NVIDIA driver for Microsoft Windows XP with CUDA support (174.55). nếu bạn dùng OS là Windows 32-bit thi chon vào x86 trong muc “Architecture” ñể download (Figure 1). Figure 1 1. Tiếp theo 1 site “NVIDIA Driver Download” sẽ xuất hiện và bạn click vào text “click here” ñể download.Figure 2. Figure 2 Hộp thoại “File Download” xuất hiện và bạn click “Save”. Figure 3. Save Figure 3 2. hộp thoại “ Save As” hiễn thị ra ñể hỏi bạn nơi muốn save file driver, lúc này bạn chọn ñường dẫn nơi muốn save file và click “Save” (Figure 4). Chờ 1 thời gian ñể chương trình tự dộng download file ñược hoàn tất. Figure 4 • Cách cài ñặt CUDA driver. Sau khi download xong, bạn double click vào file *.exe ñã download ( ví dụ trong trường hợp này là file “169.21_forceware_winxp_32bit_english_whql” dung cho “ Geforce8800GT”, Operation System “Window XP”, language “English(US)”). Tiếp theo bạn chọn “I accept the terms in the license agreement” rồi click “Next”. Chương trình sẽ nơi mà bạn muốn cài chương trình. Theo tôi bạn nên ñể mặc ñịnh” c:\NVIDIA\Win2k\169.21\English” (Figure 5) Figure 5 Click “Next” ñề chương trình load các file cần cài ñặt, Click “Next” ñể chương trình cài ñặt tự ñông (Figure 6). Figure 6 Chờ trong giây lát, sau khi chương trình cài ñặt xong bạn click “Finish” ñê khởi ñộng máy lại. Download file SDK và Toolkit. Sau khi ñã cài dat driver cho card ban cần phải cài bộ công cụ hỗ trợ lập trình cho CUDA Bạn cần download 2 file “NVIDIA_CUDA_Toolkit_1.0.exe” và “NVIDIA_CUDA_SKD_1.0.exe” tại site http://www.nvidia.com/object/cuda_get.html#windows . tùy thuộc vào OS của máy bạn là 32 hay 64-bit (nếu 32-bit bạn chọn Architecture là “x86” và nếu là 64-bit bạn chon “x86-64”) (hinh 4.1).Cách download 2 file này hoàn toàn giống nhau. Sau khi click vào kiểu Architecture, một site mới sẽ xuất hiện tiếp theo bạn click vào “click here” ñể download file. ðể thực h iện download file bạn thực hiện các bước 1,2,3 của mục 4.1.1 • Cài ñặt CUDA Toolkit. NVIDIA_CUDA_Toolkit_1.0.exe file này chứa công cụ các thư viện hỗ trợ trong lập trình cuda và các tài liệu hướng dẫn lập trình. Cách install file Toolkit. Sau khi download file “NVIDIA_CUDA_Toolkit_1.0.exe” (hoặc mới hơn) bạn double click vào file này ñể cài ñặt vào hệ thống. sau khi double click vào file này thì chương trình cài ñặt tự ñộng “Install Shied Wizard” sẽ ñược kích hoạt. Click button “Next” ñể cài ñặt chương trình. Tiếp theo bạn chọn “I accept the terms of license Agrement” và click “Next” (hình 4.10), lúc này chương trinh sẽ hỏi nơi bạn muốn cài ñặt (theo tôi bạn nên ñể chế ñộ default C:\CUDA) Figure 7 Click “Next” ñể tiếp tục qua bước tiếp theo. Bạn click “Install” ñể cài ñặt phần mềm sau khi qua các bước mà chương trình “Install Shied Wizard” ñẵ hướng dẫn. chờ 1 vài phút sau khi chương trình cài ñặt xong bạn click “Finish” ñể kết thúc việc cài ñặt. • Cài ñặt SDK NVIDIA_CUDA_SKD_1.0.exe ñây là bộ SDK của NVIDIA. Trong file này sau khi cài ñặt sẽ chứa các dự án mẫu. các dự án này rất quan trọng trong việc tự nghiên cứu của ban. 1. Sau khi download file “NVIDIA_CUDA_SDK_1.0.exe” (hoặ mới hơn) bạn double click vào file này ñể cài ñặt vào hệ thống. sau khi double click vào file này thì chương trình cài ñặt tự ñộng “Install Shied Wizard” sẽ ñược kích hoạt. 2. Click button “Next” ñể cài ñặt chương trình. Tiếp theo bạn chọn “I accept the terms of license Agrement” và click “Next”.bước này ñược thực hiện tương tự bước 2 của cách install file Toolkit. 3. Chương trinh sẽ hỏi một số thông tin của bạn. Bạn cần phải ñiền tên vào textbox “Name”. ñiền tên công ty hoặc tổ chức vào Textbox “Organization”, và ñiền ñịa chỉ Email của bạn vào “Email(Optional)”.(Figure 8) NameOrganizationEmailNext Figure 8 4. Click “Next” ñể tiếp tục. chương trình sẽ yêu cầu bạn chỉ rõ nơi bạn muốn cài ñặt (theo tôi bạn nên ñể chế ñộ default C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK) rồi click “Next” ñể tiếp tục qua bước tiếp theo. 5. Click “Install” ñể cài ñặt phần mềm sau khi qua các bước mà chương trình “Install Shied Wizard” ñẵ hướng dẫn. chờ 1 vài phút sau khi chương trình cài ñặt xong bạn click “Finish” ñể kết thúc việc cài ñặt. Hầu hết các chương trình cuda mẫu ñược NVIDIA cung cấp chạy trên nền Visual C++. Vì thế bạn cần phải có phần mềm Microsoft Visual C++, có thể dùng bảng Microsoft Visual Studio C++ Express,ñược cung cấp miễn phí. Sau khi ñã hoàn tất việc cài ñặt, bạn có thể mở dự án mẫu “deviceQuery” của NVIDIA cung cấp trong C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\bin\win32\Release và chạy thử, nếu thành công chương trình sẽ hiển thị cấu hình card GPU của bạn và hiển thị thong báo TEST 3. Cách cài ñặt chương trình Visual profiler Visual profiler ñược cung cấp bởi NVIDIA dùng ñể phân tích và ñánh giá 1 chương trình cuda. Download visual profiler từ site: http://www.nvidia.com/object/cuda_get.html#windows. Trong site này bạn sẽ tìm thấy dòng text “Cuda Visual Profiler” trong bảng “Cuda for Windows”(hình 4.9). Việc download chương trình này tương tự như bước 7,8,9 của mục 4.1.1. Sau ñó bạn extract file “CudaVisualProfiler_0.2_beta_windows.zip” Sau khi extract sẽ xuất hiện folder “CudaVisualProfiler” trong ñó chứa 2 folders “bin” và “Projects”. Folder “project” sẽ chứa thộng tin của 1 dự án cuda sau khi ñược phân tích. Folder “bin” chứa các file *.dll và 1 file “cudaprof.exe” ñây là file chương trình Cuda Visual Profiler. Chạy chương trình Cuda Visual Profiler bằng cách double click vào file “cudaprof.exe” (Figure 9). Figure 9 Chương trình này sẽ hoạt ñộng mà không cần phải cài ñặt. 4. Tạo highlighting cho syntax của 1 file cuda (*.cu) 1 file nguồn cuda ñược mở rộng bằng “*.cu”. nếu bạn dùng Microsoft Visual C++ ñể mở file này thì nó sẽ hiển thị dạng file text (sẽ không trực quan bởi vì các biến, tu khóa ñều là màu ñen.) ñể tăng khả năng trực quan cho chương rình dễ quan sát. NVIDIA cung cấp 1 file nhúng vào Microsoft Visual C++ ñể file “*.cu” hiển thị trực quan dưới Microsoft Visual C++ như 1 file “*.cpp”. 1. Bạn vào ñường dẫn “C:\Program Files\NVIDIA CUDA SDK\doc\syntax_highlighting\visual_studio_8” và copy file “usertype.dat” vào “C:\Program Files\Microsoft Visual Studio 8\Common7\IDE”. 2. Tiếp theo bạn vào menu “tool ->options…” trong hộp thoại “Options” bạn vào “Text Editor->File Extension” (hình 4.15). Phía bên phải hộp thoại trong “Extension:” text bạn gõ vào “cu” (tên mở rộng của chương trình cuda) 3. Tiếp theo trong listbox “Editor:” bạn chọn Microsoft Visual C++ (môi trường hoạt ñộng của cuda file). Sau ñó bạn click button “Apply” and then click “OK”.khởi ñộng lại Microsoft Visual studio ñể hoàn tất (Figure 10). (2)(3) Figure 10 Bây giờ bạn ñã hoàn tất việc làm highlighting 1 file *.cu, làm chương trình sang sủa dễ ñọc hơn 5. Cách thiết lập 1 dự án CUDA trên Microsoft Visual C++ 2005 Những phần trước ñã giới thiệu các cài ñặt lien quan ñến 1 dự án CUDA.trong mục 4.4 giới thiệu cách hoạt ñộng 1 chương trình mẫu ñược NVIDIA SDK cung cấp kèm theo. Tuy nhiên bạn có thể chạy bất cứ chương trình mẫu nào của NVIDIA SDK cung cấp. Trong phần này sẽ chỉ ra phương pháp tạo tự mình tạo ra 1 dự án CUDA. ðề ñơn giản ta sẽ tạo 1 dự án console Mở Microsoft Visual C++, vào menu “File->New->Project…” hộp thoại “New Project” hiển thị bạn vào “Visual C++->Win32” sau ñó chọn “Win32 Console Application”. Bạn có thể ñặt tên cho dự án là “CudaStep1” và solution “CudaProgram”. Sau ñó bạn click “OK->Next->Finish”. Cho ñến thời ñiểm này bạn ñã có 1 dự án console nhưng chưa phải là dự án cuda (Figure 11). Figure 11 Vào của sổ “Solution Explorer click phải vào “Header Files->Add->New Item…” hộp thoại “Add new Item- CudaStep1” hiển thị. Tiếp theo bạn vào ” Visual C++->Code” chọn “Header File(.h)” và ñặt tên “CudaHeader.h” rồi click Add (Figure 12). File này sẽ chứa thông tin vế cấu hình của chương trình cuda và prototype của các hàm kernel mà bạn sẽ viết. Name Figure 12 Tiếp theo cần tạo 1 file chứa mã nguồn cho 1 chương trình cuda, file này sẽ ñược mở rộng bằng “.cu” tương tự như bước 2 bạn vào của sổ “Solution Explorer click phải vào “Header Files->Add->New Item…” hộp thoại “Add new Item- CudaStep1” hiển thị. Tiếp theo bạn vào ” Visual C++->Utility” chọn “Text File (.txt)” và ñặt tên là “CudaFunction.cu” rồi click Add. Cho ñến lúc này bạn ñã tạo ra 1 dự án cuda, nhưng chương trình vẩn chưa hoạt ñộng ñược vì bạn chưa viết code cho chương trình. ðể mô tả hoạt ñông chương trình ta cần 1 chươn trình nhỏ xử lý 1 matrix gồm 32 phần tử. hàm cuda sẽ có nhiệm vụ tăng giá trị 1 phần tử lên 1 ñơn vị Mở file “CudaStep1.cpp” và khởi tạo 1 matrix dùng làm dữ liệu mẫu ñể tính toán Có thể copy ñoạn chương trình sau: // cudastep1.cpp : Defines the entry point for the console application. #include "stdafx.h" #include <stdio.h> #include "CudaHeader.h" #include <iostream> using std::cout; using std::cin; //prototype display function de hien thi len man hinh void display(float *matrix, int col, int row); //ham chính int _tmain(int argc, _TCHAR* argv[]) { //khởi tạo mảng và gán giá trị ban ñầu float matrix[32]; for (int I = 0; I < 32; i++) { matrix[i] = 9; } //hiển thị matran chưa xử lý cout<<"before call cuda function \n"; display(matrix, 8, 4); //gọi hàm tính toán của chương trình cuda CudaProcessing(matrix); //hiển thị matran sau khi tính toán cout<<"after call cuda function \n"; display(matrix, 8, 4); //dừng màn hình ñể xem xét dữ liệu int wait; cin>>wait; return 0; } //************************************************************************************// //display a matrix void display(float *matrix, int col, int row) { printf("\n"); for(int I = 0; I < row; i++) { printf("\nRow %2d:\n", i); for(int j = 0; j < col; j++) { printf(" "); printf("%.1f", matrix[I * col + j]); } } printf("\n\n"); } Mở file “CudaHeader.h” và type ñoạn code sau vào file “CudaHeader.h” /*chương trình này dùng ñể xử lý 1 matrix với 32 phần tử nên ta cần 32 threads 1 Block sẽ chứa 16 threads vậy ta cần 2 block ñể có 32 threads*/ #define XTHREADS 16 #define YTHREADS 1 #define ZTHREADS 1 #define XBLOCKS 2 #define YBLOCKS 1 #define MATRIXSIZE 32 //prototype CudaProcessing kernel function extern "C" {void CudaProcessing( float *hostData);}; Mở file “CudaFunction.cu” ñể viết hàm tính toán. Trong file này ta sẽ viết 2 hàm, hàm “CudaProcessing” dùng trong việc truyền dữ liệu giữa Host, Device và gọi hàm kernel ñể tính toán. Hàm còn lại là “CudaProcessingKernel” dùng ñể tính toán. #include "CudaHeader.h" #include <cuda.h> #include <cuda_runtime.h> #include <cuda_runtime_api.h> #include <cutil.h> extern "C" //prorotype hàm kernel __global__ void CudaProcessingKernel(float *data); /*hàm này dùng ñể chuyển data từ Host qua Device, gọi hàm kernel sau ñó truyền dữ liệu ñã tính toán về lại cho Host*/ void CudaProcessing( float *hostData) { // chuẩn bị bộ nhớ trên Driver ñể chứa data nhận từ Host float *deviceData; int size = sizeof(float)*MATRIXSIZE; cudaMalloc((void**)&deviceData, size); //copy data từ bộ nhớ Host vào bộ nhớ Device ñể tính toán cudaMemcpy(deviceData, hostData, size, cudaMemcpyHostToDevice); //khai báo số thread trên 1 block cần ñể xử lý dim3 dimBlock(XTHREADS, YTHREADS); //khai báo số block trên 1 grid cần ñể xử lý dim3 dimGrid(XBLOCKS, YBLOCKS); //gọi chương trình tính toán kernel CudaProcessingKernel<<<dimGrid, dimBlock>>>(deviceData); //sau khi tính toán xong dữ liệu ñược trả về lại cho bộ nhớ Host cudaMemcpy(hostData, deviceData, size, cudaMemcpyDeviceToHost); //xóa bộ nhớ tạm thời trên Device cudaFree(deviceData); }