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);
Đâ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
@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? –
@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