Вы находитесь на странице: 1из 16

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)

Organization Name

Email

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.
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).
(3)
(2)

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);
}
__global__ 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
Corporation/NVIDIA CUDA SDK/common/inc" “ ñể kết nối các header của
chương trình Cuda (Figure 14).

Figure 14

 Vào “Configuration Properties->linker->General” trên của sổ phía bên phải bạn


vào “Additional Library Directories” và nhập ñường dẫn chứa dến các file library
của Cuda.” $(CUDA_INC_PATH);./;../../common/lib;"C:/Program Files/NVIDIA
Corporation/NVIDIA CUDA SDK/common/lib";"C:/CUDA/lib"”
vào “Configuration Properties->linker->Input” trên của sổ phía bên phải bạn vào
“Additional Dependences” và nhập tên các thư viện cần thiết cho chương trình.
Trong trường hợp này ta dùng 2 thư viện “cudart.lib cutil32.lib”.(Figure 15).

Figure 15

Bây giờ thử biên dịch và chạy chương trình bạn sẽ thấy kết quả hiện lên màng
hình console.
Giải thích code:
Trong file “CudaStep1.cpp” chứa hàm Main() và hàm hiển thị display(). Trong hàm
main() 1 matrix sẽ ñược khởi tạo và gán giá trị ban ñầu là 9. Sau ñó hàm main()
cho hiển thị gia trị của matrix chua tính toán nay lên man hình.
Tiếp theo chương trình chính sẽ gọi hàm tính toán (“CudaProcessing()”) của device
và truyền matrix này ñể device tính toán.
Sau khi tính toán xong thì hàm main() sẽ cho hiển thị kết quả lên màn hình.
Trong file “CudaFunction.cu” sẽ tồn tại 2 hàm.
Hàm “CudaProcessing()” dùng ñể copy data từ bộ nhớ Host sang bộ nhớ device
sau ñó gọi hàm tính toán kernel, sau khi kết thúc tính toán dữ liệu ñược trả về lại
cho Host.
Hàm “CudaProcessingKernel()” dùng ñể tính toán. Số thứ tự của mỗi phần tử trong
matrix sẽ tương ứng với số thứ tự của mỗi thread trong grid, ñiều này ñược xác ñịnh
thông qua chỉ số “tid”
6. Cơ chế hoạt ñộng 1 chương trình cuda
Ta sử dụng Cuda vì mong muốn chương trình chạy nhanh hơn nhờ khả năng xử lý song
song. Vì thế tốt hơn hết chúng ta cần loại bỏ các ảnh hưởng làm 1 chương trình chạy
chậm ñi.
1 chương trình cuda hoạt ñông theo mô hình SIMD (single instruction multiple data) vì
thế các ảnh hưởng chính ñến tốc ñộ của chương trình là sự không thống nhất và tranh
chấp vùng nhớ trong quá trình ñọc và lưu data. ðiều này buộc trình biên dịch phải
chọn giải pháp an toàn trong truy cập dữ liệu, ñiều này biến 1 chương trình song song
theo mô hình SIMD biến thành mô hình nối tiếp.
Kích thước của kiễu dữ liệu rất quan trọng trong việc truy cập data 1 cách thống nhất
(coalescing) kích thước data phải bằng 4,8,16 bytes.
ngoài ra nếu số lệnh tính toán là lớn thì ta nên copy data từ global memory vào shared
memory ñể hạn chế việc truy cập thường xuyên vào global memory làm chậm chương
trình (do việc truy cập vào global memory mất rất nhiều thời gian hơn truy cập vào
shared memory)
Pattern của 1 chương trình cuda thường sử dụng 2 hàm (1 hàm dành cho việc truy cập
data và hàm còn lại thường ñược gọi là hàm kernel dùng cho việc xử lý data)
//hàm dùng trong việc truy cập data
Void DataFunction( type hostData)
{
//tạo 1 vùng nhớ trên device ñể lưu data từ host vào device
Type *deviceData;
Int size=sizeof(type)*(số phần tử của deviceData);
cudaMalloc((void**)&deviceData,size);
//copy data từ bộ nhớ Host vào bộ nhớ Device ñể tính toán
cudaMemcpy(deviceData, hostData, size, cudaMemcpyHostToDevice);

//tạo 1 vùng nhớ ñể lưu data sau khi tính toan


Type *resultData;
Int resultSize =sizeof(type)*(số phần tử của resultData);
cudaMalloc(void**)&resultData,resultSize);
//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,resultData);
//sau khi tính toán xong dữ liệu ñược trả về lại cho bộ nhớ Host
cudaMemcpy(hostData, resultData, resutlSize, cudaMemcpyDeviceToHost);
//xóa bộ nhớ tạm thời trên Device
cudaFree(deviceData);
cudaFree(resultData);
}
//hàm dùng trong tính toán data
__global__ void CudaProcessingKernel(type *data, type * result)
{
//số thứ tự block trên 1 grid
int bx=blockIdx.x;
int by=blockIdx.y;
//số thứ tự thread trên 1 block
int tx=threadIdx.x;
int ty=threadIdx.y
//copy data từ global memory vào shared memory
__shared__ type sharedData[…];
__shared__ type sharedResult[…];
//ñồng bộ hệ thống ñể ñảm bảo data ñã ñược copy lên shared memory
__synchreads();

//tính toán data dựa theo chỉ số của thread


//ñồng bộ các thread ñể ñảm bảo data ñã ñược tính toán xong
__syncthreads();
}
ðể hiểu cách hoạt ñộng 1 chương trình cuda ta cần thống nhất 1 số các khái niệm sau.
Host: là những tác vụ và cấu trúc phần cứng, phần mềm ñược xử lý từ CPU.
Driver: là những tác vụ và cấu trúc phần cứng, phần mềm ñược xử lý từ GPU.
Figure 16

Cách hoạt ñộng ñược mô tả như sau:


1) Dữ liệu cần ñược tính toán luôn ở trên bộ nhớ của Host vì vậy bước 1 truyền dữ
liệu cần tính toán từ bộ nhớ Host qua bộ nhớ Device.
2) Sau ñó Device sẽ gọi các hàm riêng của mình ñể tính toán dữ liệu ñó.

Sau khi tính toán xong, dữ liệu cần ñược trả về lại cho bộ nhớ của Host.

7. ðánh giá 1 chương trình CUDA dựa vào Cuda visual profiler
Trong phần 4.3 ñã miêu tả cách cài ñặt 1 chương trình Visual profiler. Bây giờ ta sử
dụng phần mềm ñó ñể quan sát 1 dự án cuda.
Chạy chương trình Visual profiler bằng cách double click vào file “visualprof.exe”
1) Tạo 1 project mới bằng cách vào menu “File->New” hoặc dùng toolbar. Sau ñó hộp
thoại “New Project” xuất hiện, bạn cần ñiền tên và ñường dẫn ñể lưu lại dự án này
(trong trường hợp này ta dùng tên là “CudaStep1Test”) (Figure 17).

Figure 17

2) Click OK hộp thoại “session settings” xuất hiện. Vào laugh chọn file trong dự án
cuda mà bạn ñã biên dịch thành công (trong trương hợp này chọn file
“CudaStep1.exe”) rồi click Start ñễ chương trình hoạt ñộng (Figure 18).
Figure 18

Lưu ý: chương trình visual profiler sẽ hiển thị 1 thông báo lỗi do chương trình
“CudaStep1.exe” không kết thúc. ðể giải quyết vấn ñề này bạn xóa bỏ dòng lệnh
“cout>>wait;” trong file “CudaStep1.cpp” rồi biên dịch lại chương trình. Bây giờ bạn
có thể dùng visual profiler ñể quan sát dự án “CudaStep1.exe”.(Figure 19).

Figure 19

Nếu thành công chương trình sẽ hiển thị 1 table chứa các thông số cấn thiết ñể ñánh
giá 1 dự án cuda. Dữ liệu thu ñươc sau khi phân tích sẽ ñược lưu trong file Excel.
.

Вам также может понравиться