Lập trình song song dữ liệu trên GPU OpenCL
ĐẠI HỌC QUỐC GIA TP HỒ CHÍ MINH TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN KHOA CNTT - BỘ MÔN KHMT BÁO CÁO MÔN HỌC LẬP TRÌNH SONG SONG DỮ LIỆU TRÊN GPU OpenCL Thông tin nhóm thực hiện: Cào Cào Họ tên Thành viên OpenCL MSSV TL đóng góp Nguyễn Hùng Sơn 1/3 Nguyễn Trung Tín 1/3 Trần Quốc Tự 1/3 Mục lục I Giới thiệu OpenCL Tổng quan Lịch sử hình thành Đặc điểm 3.1 OpenCL, chuẩn lập trình mở 3.2 Tận dụng tối đa tài nguyên có máy tính Ngôn ngữ Hạ tầng (Platform) Tầm vực OpenCL II Kiến trúc OpenCL hệ điều hành Mac OS X Sơ lược Mac OS X Framework & Runtime Compiler Operation Model 4.1 Platform Model 4.2 Execution Model 10 4.3 Memory Model 11 4.4 Programming Model 12 III Workflow phát triển chương trình OpenCL 13 Các bước viết chương trình OpenCL 13 1.1 Xác định nhiệm vụ thực song song 13 1.2 Viết kernel hàm bổ trợ 13 1.3 Setup context 13 1.4 Viết mã lệnh để biên dịch build chương trình OpenCL 13 1.5 Khởi tạo đối tượng memory object 14 1.6 Lập hàng đợi lệnh có thứ tự (enqueue command) để điều khiển việc thực thi liên tục đồng kernel, đọc ghi liệu, thao tác memory object 14 OpenCL 1.7 Đọc giá trị trả 14 Viết Kernel 14 Truy vấn thiết bị 16 Khởi tạo OpenCL Context 16 Khởi tạo Program Object 17 Build Program Executable 19 Khởi tạo Kernel Object 22 Khởi tạo Memory Object 22 Thực thi kernel 22 9.1 Xác định số chiều liệu: 23 9.2 Xác định số lượng work-item 23 9.3 Chọn kích thước cho work-group 23 9.4 Enqueue Kernel Execution 25 10 Nhận kết trả 28 10.1 Chờ kernel hoàn tất thực thi 28 10.2 Đọc kết 29 11 Giải phóng nhớ 29 12 Debug chương trình OpenCL 29 IV Performance 31 GPGPU Performance 31 1.1 Số thực 31 1.2 Bandwidth 32 1.3 Nhận xét 32 CPU Performance 33 2.1 Số học 33 2.2 Bandwidth 34 2.3 Nhận xét 34 IV Tài liệu tham khảo 35 OpenCL I Giới thiệu OpenCL Tổng quan OpenCL (Open Computing Language) chuẩn mở (công bố vào 12/2008) hỗ trợ lập trình song song thiết bị (bao gồm GPU), đề xuất Apple nhượng lại quyền phát triển cho Khronos Group Dù đời OpenCL lại nhận nhiều hỗ trợ từ nhà sản xuất phần cứng Danh sách nhà sản xuất phần cứng ủng hộ OpenCL OpenCL Lịch sử hình thành OpenCL ban đầu đề xuất phát triển Apple sau phát triển thêm với hợp tác AMD, IBM, Intel,và nVidia Sau Apple nhượng lại quyền phát triển cho Khronos Group (tổ chức nắm giữ chuẩn mở khác OpenGL, OpenAL…) • 16/06/2008: Nhóm Khronos Compute Working thành lập với đại diện đến từ công ty CPU, GPU, thiết bị nhúng vi xử lý khác • 18/11/2008: đưa đặc tả kĩ thuật OpenCL 1.0 • 08/12/2008: OpenCL 1.0 thức phát hành • 20/04/2009: nVidia mắt OpenCL driver SDK để phát triển chương trình OpenCL Early Access • 05/08/2009: AMD giới thiệu công cụ phát triển cho tảng OpenCL phần chương trình ATI Stream SDK v2.0 Beta Đặc điểm 3.1 OpenCL, một chuẩn lập trình mở Đây điều trước tiên phải nói đến, OpenCL chuẩn lập trình mở hỗ trợ miễn phí cho tất hãng phần cứng có nhu cầu tìm hiểu ứng dụng Do đó, hỗ trợ kĩ thuật OpenCL đăng tải miễn phí website Khronos Group OpenCL phát triển theo xu hướng cross-platform, độc lập với hạ tầng phần cứng thiết bị tính toán hệ điều hành nên nhận ủng hộ nhiều nhà sản xuất 3.2 Tận dụng tối đa các tài nguyên có thể có của máy tính OpenCL phát triển theo xu hướng tận dụng tất thiết bị tính toán thực thi song song Điều có nghĩa ta có CPU đa nhân với OpenCL lập trình để thực thi tác vụ song song CPU Hơn nữa, OpenCL hỗ trợ lập trình song song tác vụ (task-parallel programming) lập trình song song liệu (data-parallel programming) OpenCL Ngôn ngữ OpenCL sử dụng ngôn ngữ OpenCL-C dựa chuẩn C99 cho lập trình kernel IEEE754 (chuẩn dấu chấm động cho số học) nên cú pháp hoàn toàn giống với C/C++ Hạ tầng (Platform) Do phát triển theo hướng độc lập với hạ tầng phần cứng nên OpenCL tự xây dựng lớp phần cứng trừu tượng cho thân độc lập hoàn toàn với hạ tầng phần cứng thiết bị Mô hình hạ tầng: • Một host bao gồm nhiều Compute Device (Core – CPU / SM – GPU / …) • Một Compute Device (CPU / GPU / …) bao gồm nhiều Compute Unit • Một Compute Unit phân chia thành nhiều Processing Element (vd: SP SM GPU) OpenCL Tầm vực OpenCL Phần cứng: OpenCL hỗ trợ lập trình song song CPU, GPU hay chí thiết bị nhúng di động Danh sách GPU OpenCL thức hỗ trợ bao gồm: Nvidia: • • • • • • • • • • GeForce 9400M GeForce 9600M GT GeForce 8600M GT GeForce GT 120 GeForce GT 130 GeForce GTX 285 GeForce 8800 GT GeForce 8800 GS Quadro FX 4800 Quadro FX 5600 Thực tế chip dòng G80, G90 nVidia cao hơn, chí GPU GTX200 series hỗ trợ OpenCL GPU có công nghệ CUDA nVidia ATI: • Radeon 4850 • Radeon 4870 Đối với CPU, OpenCL hỗ trợ chip thuộc hai hãng lớn Intel AMD Do OpenCL chưa nhiều hãng thiết kế phần cứng hỗ trợ chuẩn Nhưng tương lai hứa hẹn OpenCL chuẩn nhiều “ông lớn” ngành công nghiệp phần cứng hỗ trợ Và dù đời không lâu đại gia thức hỗ trợ OpenCL loạt sản phẩm hiệu cao Về tảng hệ điều hành: OpenCL chạy Mac OS X, Windows Linux OpenCL II Kiến trúc OpenCL hệ điều hành Mac OS X Sơ lược Mac OS X Hệ máy Macintosh Apple tiếng thiết kế đẹp tinh tế, hệ thống phần cứng cao cấp, tối đồng tối ưu phần cứng với phần mềm Hệ điều hành Mac OS X góp phần không nhỏ vào thành công nhờ vào tính đơn giản ổn định, hệ màu chuẩn, bị tổn hại với công nghệ tiên tiến (Grand Central Dispatch, 64-bit,…) có OpenCL, nói Mac OS X Snow Leopard 10.6 hệ điều hành trực tiếp đưa OpenCL vào “Core” Framework & Runtime OpenCL framework Mac OS X cung cấp đầy đủ headers cần thiết để dễ dàng thực biên dịch mã nguồn OpenCL giao tiếp với OpenCL Runtime Chỉ đơn giản với dòng lệnh #include , ta sử dụng API OpenCL mà không cần phải khai báo thêm chương trình Theo hình vẽ minh họa bên, mô hình làm việc OpenCL tương tự CAL ATI hay CUDA nVidia Một điều dễ thấy OpenCL runtime làm việc trực tiếp với driver phần cứng, số ý kiến cho OpenCL chuẩn ngôn ngữ lập trình song song nên chạy nhanh CAL/CUDA hoàn toàn sai lệch Vì làm việc trực tiếp với driver phần cứng nên OpenCL runtime coi tương đương với CAL/CUDA việc hiệu cao CAL/CUDA bình thường Một số hãng phần cứng ATI đưa OpenCL vào công cụ lập trình song song mình, mức mặt cú pháp hình thức không sử dụng OpenCL OpenCL runtime tầng giao tiếp với driver giữ CAL mà ko sử dụng OpenCL runtime Đó lý STREAM chạy chậm OpenCL số nguyên nhân Compiler OpenCL compiler Mac OS X sử dụng LLVM Khi biên dịch chương trình OpenCL, trước hết thị chương trình dịch sang dạng biểu diễn trung gian (Intermediate Representation – IR) Sau đó, LLVM dịch tối ưu hóa IR sang mã phù hợp với thiết bị mà chương trình thực thi Điểm nhấn nằm chỗ: chương trình cần viết lần chạy nhiều kiến trúc phần cứng khác Và ứng với hệ thống phần cứng, lần biên dịch chương trình “cache” lại để tránh việc biên dịch trùng lặp không cần thiết Operation Model Sự vận hành OpenCL mô tả cụm model có mối liên hệ với nhau, bao gồm Platform Model (mô hình hạ tầng), Execution Model (mô hình thực thi), Memory Model (mô hình nhớ), Programming Model (mô hình lập trình) 4.1 Platform Model Như nói trên, OpenCL device làm việc với host device – device điều khiển chương trình hoạt động Khi chương trình thực thi, host tạo môi trường trừu tượng hay gọi môi trường ảo (context) cung cấp thiết bị tính toán (compute device) với khoảng vùng nhớ định mà chương trình sử dụng Bên cạnh “hàng đợi lệnh có thứ tự” (command queue) tạo để chương trình điều phối lệnh kernel thực thao tác truy xuất tới nhớ OpenCL Lưu ý: tốc độ truy xuất device chậm nhiều so với tốc độ giao tiếp nội thành phần device thân host device (vd: CPU) OpenCL device 4.2 Execution Model Kernel: tập lệnh viết để thực thi thiết bị hỗ trợ OpenCL (OpenCL device) Tập kernel hàm bổ trợ (helper function) gọi Program Khi biên dịch chương trình, kernel biên dịch thành kernel object tương tự với program ta có program object Việc thực thi chương trình OpenCL bao gồm nhiều thực thi cách đồng thời instance kernel nhiều OpenCL device command queue điều phối ứng dụng host (host application) Mỗi instance kernel gọi work-item Mỗi work-item thực thi đoạn mã lệnh vùng liệu khác work-item chạy single-core multiprocessor Khi ấn định thực thi chương trình device đó, ta xác định số lượng work-item cần thiết để hoàn tất việc xử lý liệu mà ta gọi index space (không gian mục) OpenCL hỗ trợ index space tối đa chiều Các work-item nhóm lại thành work-group OpenCL có chế đồng hóa tính toán work-item work-group không hỗ trợ tương tự work-group với Mỗi work-item chương trình có định danh - global ID để hỗ trợ truy xuất index space Ví dụ, work-item không gian mục chiều có giá trị X 23 Y mang global ID (23, 6) Tương tự, workOpenCL 10 Trong ví dụ trên, ứng dụng dùng số CL_PROGRAM_BUILD_LOG nhằm lấy thông tin chi tiết lỗi Ta sử dụng clGetProgramBuildInfo để lấy thông tin khác build options mà ta sử dụng gọi hàm clBuildProgram, hay tình trạng biên dịch OpenCL 21 Khởi tạo Kernel Object Một kernel object chứa thông tin đặc biệt kernel function khai báo chương trình mã nguồn, tham số sử dụng thực thi kernel Mặt khác, thân kernel hàm, kernel cấu trúc liệu phức tạp bao gồm kernel function liệu mà kernel thao tác Khi muốn thực thi kernel, ta sử dụng kernel object chứa kernel đưa vào command queue Sử dụng hàm clCreateKernel để khởi tạo kernel object gọi hàm clCreateKernelsInProgram để tạo kernel object cho tất kernel chương trình OpenCL Các phần cung cấp nhìn tổng quan cách khởi tạo memory object để chứa liệu, kết hợp liệu với kernel object thực thi kernel Khởi tạo Memory Object Memory object thực chất “một vùng bảo quản” từ global memory thiết bị xem nơi chứa liệu chương trình Sau khởi tạo đăng ký kernel với OpenCL runtime, gửi liệu ứng dụng tới kernel chạy thiết bị khác cách đóng gói liệu vào memory object trước tiên, sau liên kết memory object với kernel đặc biệt Như mô tả trên, có loại memory object: buffer object khối nhớ, image object lại cấu trúc phức tạp, đặc thù dành để biểu diễn đối tượng ảnh 2D hay 3D Để khởi tạo buffer object, ta dùng hàm clCreateBuffer Tương tự ta sử dụng hàm clCreateImage2D hay clCreateImage3D cho liệu ảnh phù hợp Các hàm trả đối tượng có kiểu liệu cl_mem Thực thi kernel OpenCL thực thi kernel theo chế song song liệu, có nghĩa là, instance kernel (hay gọi work-item) thực thi phần khác tập liệu (Nếu muốn thực thi song song tác vụ, ta phải enqueue nhiều kernel thiết bị khác nhau) Mỗi work-item chịu trách nhiệm thực thi kernel lần thao tác phần liệu giao Chúng ta có nhiệm vụ xác định số lượng work-item cần OpenCL 22 thiết để xử lý tất liệu Bởi tập liệu thường tổ chức dạng một, hai, ba chiều (dữ liệu âm thanh, ảnh hai hay ba chiều, đối tượng ba chiều) 9.1 Xác định số chiều của dữ liệu: Bước chuẩn bị thực thi kernel xác định số chiều mà ta muốn sử dụng để biểu diễn liệu Ví dụ, liệu biểu diễn ảnh hai chiều có kích thước m x n, ta có tập liệu hai chiều với điểm liệu biểu diễn tọa độ hai trục m n OpenCL chưa hỗ trợ số chiều lớn 9.2 Xác định số lượng work-item Bước muốn thực thi kernel xác định có work-item cần thiết để xử lý hết liệu (global work size), định nghĩa tổng số work-item ba chiều Với liệu chiều, global work size với với số lượng data item Với liệu hai chiều, global work size m*n Tương tự x*y*z với liệu chiều có x, y, z work-item chiều Thực tế giới hạn số lượng work-item, số lượng work-item lớn tận dụng khả tính toán GPU (hơn 1000) 9.3 Chọn kích thước cho work-group Khi enqueue kernel để thực thi thiết bị, ta định kích thước work-group mà OpenCL sử dụng trình thực thi Các workitem work-group chia sẻ nhớ thực thi cách đồng Để tận dụng đặc điểm này, nhiên, cần phải biết kích thước cực đại work-group mà OpenCL device muốn thực thi cho phép Ta sử dụng hàm clGetKernelWorkGroupInfo thuộc tính CL_KERNEL_WORK_GROUP_SIZE để lấy thông tin Nếu không cần chia sẻ liệu work-item work-group, truyền giá trị NULL vào tham số local_work_size enque kernel thực Lưu ý cần dùng hàm clGetDeviceInfo với tham số CL_DEVICE_MAX_WORK_ITEM_SIZE để lấy kích thước cực đại OpenCL 23 chiều work-group, gọi hàm clGetKernelWorkGroupInfo với tham số CL_KERNEL_WORK_GROUP_SIZE để lấy kích thước tổng work-group Có điều kiện cần đáp ứng để kích thước địa phương đảm bảo: Số lượng work-item chiều (local_x, local_y, local_z) work-group phải nhỏ giá trị trả từ hàm clGetDeviceInfo(CL_DEVICE_MAX_WORK_ITEM_SIZES) Tổng số work-item work-group (local_x*local_y*local_z) phải nhỏ với giá trị trả từ hàm clGetKernelWorkGroupInfo(CL_KERNEL_WORK_GROUP_SIZ) Số lượng work-item ứng với chiều work-group phải chia cho tổng số work-item chiều (global_n mod local_n = 0) Đoạn mã sau minh họa việc sử dụng hàm clGetKernelWorkGroupInfo: OpenCL 24 9.4 Enqueue Kernel Execution Sau xác định số chiều cần thiết để biểu diễn liệu, số work-item cho chiều, kích thước work-group phù hợp ta enqueue kernel để thực thi OpenCL 25 OpenCL 26 Lưu ý: Có thể dùng hàm clSetKernelArg để truyền giá trị cho tham số kernel, thứ tự tùy thuộc vào thứ tự khai báo tham số định nghĩa kernel Các bước trung gian cần thực phần trước trước xử lý enqueue kernel để thực thi (xem “Các bước viết chương trình OpenCL” – 1) Chỉ mục tham số Dữ liệu một, hai, ba chiều (xem “Xác định số chiều liệu” – 9.1) Tham số local mảng xác định kích thước chiều mảng liệu để xử lý tất liệu kernel Ví dụ, có liệu dạng ảnh hai chiều với kích thước 64x128, mảng kích thước có dạng [64, 128] Nếu muốn định kích thước work-group, ta phải định theo dạng mảng với số lượng chiều sử dụng cho liệu Giá trị mảng phải chia cho mảng giá trị global work size Ví dụ, global work size [64, 144], work-group-size [8, 12], [4, 4], hay [32, 34], [24, 32] Không thiết phải định kích thước work-group enqueue kernel Ta để OpenCL làm việc cách truyền giá trị NULL vào tham số local_work_size Tham số hai tham số dùng để kiểm soát chuỗi kiện cố xảy ý muốn gọi hàm clCreateCommandQueue Tham số xác định số lượng mục hai tham số OpenCL 27 Nếu sử dụng đối tượng kiện (event objects) để quản lý chuỗi thực thi, ta định kiện phải hoàn thành trước lệnh thực Nếu muốn định lệnh khác phải chờ lệnh thực xong, hay muốn truy vấn instance thực thi kernel sau này, ta cần chứa event object cho việc thực thi instance 10 Nhận kết trả Sau kernel thực thi xong, ta phải đọc kết trả từ device đưa vào host memory 10.1 Chờ cho đến khi các kernel hoàn tất thực thi Gán giá trị CL_TRUE vào tham số block_read để đảm bảo lệnh clEnqueueReadBuffer hay clEnqueueReadImage không kết thúc liệu đọc chép vào nhớ (Dù ta sử dụng hàm clFinish để bắt host application ngưng lại tất command command queue thực xong, hàm gây ảnh hưởng đến hiệu tốc độ chương trình) Lưu ý command queue cho trước, tất lệnh thực theo thứ tự Ta phải đồng hóa chờ lệnh thực thi command queue khác (tức thiết bị khác nhau) Cũng lưu ý dù ta đọc ghi từ buffer object kernel, image object ta phải có object riêng biệt phục vụ cho việc đọc ghi Nếu muốn chờ kernel kết thúc thực thi sau enqueue kernel khác command queue, ta dùng event object cho instance thực thi kernel quenque định lệnh chờ event object trước thực thi (xem thêm phần Lưu ý 7, 8, mục “Thực thi kernel” – 9.4) Ngoài ra, ta enqueue lệnh clEnqueueBarrier hay lệnh “chắn rào” nhớ (mem_fence, read_mem_fence, write_mem_fence) để đồng hóa lệnh work-group Để đồng hóa lệnh workgroup khác nhau, ta dùng event object Sử dụng clWaitForEvents, OpenCL 28 clEnqueueWaitForEvents clGetEvenInfo lấy thông tin lệnh, bao gồm trạng thái thực thi 10.2 Đọc kết quả Khi kernel kết thúc thực thi, ta đọc liệu từ device trả host để host applicatin xử lý liệu Để đọc liệu, gọi hàm clEnqueueReadBuffer hay clEnguqueReadImage, tùy thuộc vào loại memory object ta tạo để chứa kết output (xem thêm “Execution Model / Memory Object” – II / 4.2) Lưu ý: trừ có ý định sử dụng đối tượng memory object để giữ input output kernel, nên khởi tạo memory object riêng để chứa liệu output, gán đối số kernel 11 Giải phóng nhớ Khi host application không yêu cầu tài nguyên khác phục vụ việc chạy OpenCL context, ta cần giải phóng tài nguyên Các hàm bao gồm: • • • • clReleaseMemObject clReleaseKernel clReleaseProgram clReleaseCommandQueue 12 Debug chương trình OpenCL Hiện có vài cách phổ biến sử dụng gdb debugger để xem mã hợp ngữ chương trình biên dịch, khai báo vùng nhớ với kích thước tường minh để tìm trường hợp out-of-range truy xuất địa vùng nhớ (hiện chưa có chế bảo vệ vùng nhớ GPU) Hay sử dụng tiện ích Shark để điều chỉnh performance chương trình Tuy nhiên, bước đơn giản “thô sơ” thực thi kernel CPU dùng lệnh printf kernel OpenCL 29 Cũng cần đảm bảo điều kernel không nhiều thời gian để thực GPU thân GPU tài nguyên chia sẻ cho ứng dụng khác, việc chạy lâu tác động xấu đến phản hồi hệ thống (gây treo máy chẳng hạn) OpenCL 30 IV Performance GPGPU Performance 1.1 Số thực Môi trường : Windows Vista x64 SP2; Catalyst 9.11 video / STREAM 1.4.427 / OpenCL 1.0 Beta 4; ForceWare 190.89 video / CUDA 2.3 / OpenCL 1.0 live release Dựa theo bảng thống kê ta thấy OpenCL chậm CUDA đôi chút tính toán floating-point, lại nhỉnh tính toán doubleemulation nhanh nhiều so với CAL OpenCL 31 1.2 Bandwidth Môi trường: Windows Vista x64 SP2; Catalyst 9.11 video / STREAM 1.4.427 / OpenCL 1.0 Beta 4; ForceWare 190.89 video / CUDA 2.3 / OpenCL 1.0 live release 1.3 Nhận xét Hiệu suất hoạt động OpenCL 1.0 gần tương đương với CUDA chí nhanh số trường hợp OpenCL 32 CPU Performance 2.1 Số học Môi trường: Windows Vista SP2, Server 2003 SP2, AMD CPU OpenCL 1.0 preview OpenCL 33 2.2 Bandwidth Môi trường: Windows Vista SP2, Server 2003 SP2, AMD CPU OpenCL 1.0 preview 2.3 Nhận xét So với tiền bối Net hay Java OpenCL chưa thực chạy tốt OpenCL 34 IV Tài liệu tham khảo • OpenCL Programming Guide for Mac OS X, Mac Develeoper Center - Apple Inc., 2009 • OpenCL Techonology Brief, Apple Inc., 2009 • OpenCL – The Open Standard for Heterogeneous Parallel Programming, Kronos Group, 2009 • The OpenCL Specification, Aaftab Munshi – Kronos OpenCL Working Group, 2009 • OpenCL Quickcard Reference, Kronos OpenCL Working Group, 2009 • OpenCL Tutorials, Ph.D David W Gohara, Center for Computational Biology, Washing University School of Medicine, 2009 • OpenCL Samples & Introduction, MacResearch, 2009 • Benchmarks : OpenCL GPGPU Performance (OpenCL vs CUDA/STREAM), http://www.sisoftware.net/index.html?dir=qa&location=gpu_opencl&langx=en&a= • Benchmarks : OpenCL CPU Performance (OpenCL vs native/Java/.Net), http://www.sisoftware.net/index.html?dir=qa&location=cpu_opencl&langx=en&a= OpenCL 35 [...]... bộ nhớ trên Trong đó private memory và local memory cho tốc độ cao nhất, vùng nhớ cho tốc độ truy xuất chậm chính là global memory OpenCL 11 Các khái niệm về tầm vực của vùng nhớ trong OpenCL cũng tương tự với CUDA: 4.4 Programming Model OpenCL hỗ trợ hai mô hình lập trình song song chính: song song dữ liệu (dataparallel) và song song tác vụ (task-parallel) Các tiến trình song song dữ liệu thực... instance xử lý một tập dữ liệu riêng biệt Mỗi tập dữ liệu liên kết với một điểm trong không gian chỉ mục một, hai hay ba chiều Song song tác vụ lại tương tự như những tiến trình thực thi đa luồng có tính chất độc lập nhau, mỗi process thực hiện những nhiệm vụ khác nhau Trong OpenCL, lập trình song song tác vụ bao gồm việc lập hàng đợi nhiều kernel, và để OpenCL thực hiện chúng một cách song song sử dụng các... clCreateImage3D cho các dữ liệu ảnh phù hợp Các hàm này trả về đối tượng có kiểu dữ liệu là cl_mem 9 Thực thi các kernel OpenCL luôn thực thi các kernel theo cơ chế song song dữ liệu, có nghĩa là, các instance của cùng một kernel (hay còn gọi là các work-item) thực thi trên các phần khác nhau của tập dữ liệu (Nếu muốn thực thi song song tác vụ, ta phải enqueue nhiều kernel trên các thiết bị khác nhau)... chương trình OpenCL Các phần tiếp theo cung cấp cái nhìn tổng quan về cách khởi tạo memory object để chứa dữ liệu, kết hợp dữ liệu với kernel object và thực thi kernel 8 Khởi tạo Memory Object Memory object thực chất là “một vùng bảo quản” từ global memory của thiết bị có thể được xem như nơi chứa dữ liệu chương trình Sau khi đã khởi tạo và đăng ký kernel với OpenCL runtime, chúng ta có thể gửi dữ liệu. .. trách nhiệm thực thi kernel đúng một lần và thao tác trên phần dữ liệu được giao Chúng ta có nhiệm vụ xác định số lượng work-item cần OpenCL 22 thiết để xử lý tất cả dữ liệu Bởi vì tập dữ liệu thường được tổ chức dưới dạng một, hai, hoặc ba chiều (dữ liệu âm thanh, ảnh hai hay ba chiều, các đối tượng ba chiều) 9.1 Xác định số chiều của dữ liệu: Bước đầu tiên khi chuẩn bị thực thi một kernel... sử dụng để biểu diễn dữ liệu Ví dụ, nếu dữ liệu biểu diễn một ảnh hai chiều có kích thước m x n, khi đó ta có tập dữ liệu hai chiều với mỗi điểm dữ liệu biểu diễn bởi tọa độ của nó trên hai trục m và n OpenCL chưa hỗ trợ số chiều lớn hơn 3 9.2 Xác định số lượng work-item Bước kế tiếp khi muốn thực thi kernel là xác định có bao nhiêu work-item cần thiết để xử lý hết dữ liệu (global work size),... khi xử lý enqueue kernel để thực thi (xem “Các bước viết một chương trình OpenCL – 1) 3 Chỉ mục của tham số bắt đầu từ 0 4 Dữ liệu có thể một, hai, hoặc ba chiều (xem “Xác định số chiều của dữ liệu – 9.1) 5 Tham số local là một mảng xác định kích thước của mỗi chiều của mảng dữ liệu để xử lý tất cả dữ liệu bởi kernel Ví dụ, nếu có dữ liệu là dạng ảnh hai chiều với kích thước 64x128, thì mảng kích thước... trong OpenCL- C, và có rất nhiều hàm có khả năng tính toán hiệu suất cao được hỗ trợ sẵn cho cả dữ liệu có hướng lẫn vector 5 Kernel có thể được gọi từ một kernel khác trong cùng một chương trình OpenCL OpenCL 15 3 Truy vấn thiết bị Mỗi chương trình OpenCL đòi hỏi phải có một context, bao gồm danh sách các OpenCL device tồn tại trên hệ thống Sử dụng hàm clGetDeviceIDs để truy vấn danh sách thiết bị trên. .. thực hiện chúng một cách song song sử dụng các thiết bị tính toán có thể có OpenCL 12 III Workflow phát triển chương trình OpenCL 1 Các bước viết một chương trình OpenCL Tiến trình phát triển một chương trình OpenCL bao gồm các bước dưới đây 1.1 Xác định những nhiệm vụ nào có thể thực hiện song song Để chương trình đạt được hiệu quả cao nhất, trước tiên ta phải xác định những gì có... • OpenCL Samples & Introduction, MacResearch, 2009 • Benchmarks : OpenCL GPGPU Performance (OpenCL vs CUDA/STREAM), http://www.sisoftware.net/index.html?dir=qa&location =gpu_ opencl& langx=en&a= • Benchmarks : OpenCL CPU Performance (OpenCL vs native/Java/.Net), http://www.sisoftware.net/index.html?dir=qa&location=cpu _opencl& langx=en&a= OpenCL 35