Cuda
Trang 1Hướ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
Trang 22 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
Trang 32 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
Trang 4Download 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
Trang 52 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)
Name Organization
Next
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
Trang 6Folder “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)
Trang 7(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
Trang 8Figure 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ý
Trang 9cout<<"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”
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);};
Trang 10Mở 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);
}
Trang 11global void CudaProcessingKernel(float *data) //kernel function
{
//số thứ tự block trên 1 grid int bx = blockIdx.x;
//số thứ tự thread trên 1 block int tx = threadIdx.x;
//số thứ tự thread trên 1 grid int tid = bx * XTHREADS + tx;
//tính toán data data[tid] = data[tid]+1;
//ñồng bộ các thread syncthreads();
}
Biên dịch chương trình: bạn có thể biên dịch chương trình này với Win32 hoặc Win64, release, debug, emurelease, hoặc emudebug Tùy thuộc vào cấu hình máy của bạn và chế bạn muốn build Tuy nhiên chương trình sẽ báo lỗi vì không compiler dược file “CudaFunction.cu”
Bạn cần download builrule từ site
http://forums.nvidia.com/index.php?showtopic=30273 file “cuda_build_rule.zip” việc download file này tương tự như bước 8,9 của mục 4.1.1.Vào “Solution
Explorer” click phải lên dự án “CudaStep1” chọn “Custom Build Rules…” hộp thoại “Visual C++ Build Rule Files” hiển thị click vào “Find Existing…” bạn chọn file “cuda” (file cuda build rules sau khi ñã extract file “cuda_build_rule.zip”) và click Open (Figure 13)
Figure 13
Trở lại hộp thoại “Visual C++ Build Rule Files” bạn check vào “CUDA” ñể báo cho compiler biết sẽ dùng build rule này ñể biên dịch file cuda (*.cu)
Do trong chương trình cần kết nối các thư viện nên bạn vào Vào “Solution
Explorer” click phải lên dự án “CudaStep1” chọn “Properties” hộp thoại
“CudaStep1 property pages” xuất hiện vào “Configuration
Properties->C/C++->General” trên cửa sổ phía phải bạn vào “Additional Include Directories” và nhập ñường dẫn “$(CUDA_INC_PATH);./; / /common/inc;"C:/Program Files/NVIDIA