2012-09-05 23 views
5

Nếu biến được chuyển đến hạt nhân với CL_MEM_USE_HOST_PTR, điều đó có nghĩa là bất kỳ thay đổi nào đối với biến trong thiết bị cũng sẽ được hiển thị trong bộ nhớ máy chủ không?OpenCL: Gắn kết bộ nhớ thiết bị/máy chủ cho các biến được chuyển đến hạt nhân với CL_MEM_USE_HOST_PTR

Tôi đang ở trong một kịch bản mà tôi đang sử dụng CPU làm thiết bị thay vì GPU, vì vậy mọi thứ được chuyển đến hạt nhân sẽ được đánh dấu bằng CL_MEM_USE_HOST_PTR.

Nếu điều này là đúng, thì tôi không còn cần phải đọc mọi thứ trở lại máy chủ, rất thuận tiện.

Trả lời

8

hiểu biết của bạn là chính xác, ngoại trừ một cái bẫy có thể: documentation khẳng định rằng

triển khai OpenCL được phép bộ nhớ cache nội dung đệm trỏ đến bởi host_ptr trong bộ nhớ điện thoại. Bản sao được lưu trong bộ nhớ cache này có thể được sử dụng khi hạt nhân được thực thi trên thiết bị.

này có nghĩa là thay đổi dữ liệu được thực hiện bởi hạt nhân có thể không được phản ánh ngay trong host_ptr. Trong thực tế, không có đảm bảo rằng host_ptr chứa dữ liệu hợp lệ trong khi nó được sử dụng cho bộ đệm.

Để có dữ liệu hợp lệ và cập nhật, bạn phải buộc đồng bộ hóa. Các tài liệu offcial là một chút mơ hồ về thời điểm này, nhưng buffer mapping/unmapping chắn hoạt động:

Nếu đối tượng đệm được tạo ra với CL_MEM_USE_HOST_PTR bộ trong mem_flags, các host_ptr quy định tại clCreateBuffer được đảm bảo để chứa các bit mới nhất trong khu vực được lập bản đồ khi lệnh clEnqueueMapBuffer đã hoàn tất; và giá trị con trỏ được trả lại bởi clEnqueueMapBuffer sẽ được bắt nguồn từ host_ptr được chỉ định khi đối tượng bộ đệm được tạo.

Dưới đây là một ví dụ chuyển thể từ Khronos group forum post:

cl_mem device_output = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, size, original_output, NULL); 
// run the kernel 
void* pointer = clEnqueueMapBuffer(queue, device_output, CL_TRUE, CL_MAP_READ, size, 0, 0, NULL, NULL, NULL); 
// work with 'original_output' 
clEnqueueUnmapMemObject(queue, device_output, pointer, 0, NULL, NULL); 
clReleaseMemObject(device_output); 
+2

Đây là một tinh tế Gotcha và tôi đã cắn này quá, vì vậy nó là tốt bạn mang này lên. – Ani

+0

@aland tôi nghĩ rằng tôi đang yêu cầu rất muộn .. Nhưng thay vì lập bản đồ bộ nhớ, nếu tôi đang chờ sử dụng sự kiện .. nó sẽ cập nhật mảng thích hợp của tôi trong thiết bị chủ? cho tôi nó đang làm việc (có thể là tôi đang sử dụng sự kiện để cho kết thúc hạt nhân). nhưng sau đó tôi có thể bỏ qua bản đồ không? –

+1

@Vishwadeep Chỉ cần đợi hạt nhân kết thúc thực hiện là [* not * enough] (http://www.khronos.org/message_boards/showthread.php/6912-Clarify-CL_MEM_USE_HOST_PTR?p=22099&viewfull=1#post22099). Cách tiếp cận của bạn có thể hoạt động, đặc biệt nếu bạn chỉ sử dụng CPU như một thiết bị tính toán, nhưng đó vẫn là hành vi không xác định. – aland

Các vấn đề liên quan