2010-08-08 28 views
5

Khi tôi bắt đầu lập trình trong OpenCL tôi đã sử dụng phương pháp sau đây để cung cấp dữ liệu để hạt nhân của tôi:Memory trong OpenCL

cl_mem buff = clCreateBuffer(cl_ctx, CL_MEM_READ_WRITE, object_size, NULL, NULL); 
clEnqueueWriteBuffer(cl_queue, buff, CL_TRUE, 0, object_size, (void *) object, NULL, NULL, NULL); 

Điều này rõ ràng đòi hỏi tôi phải phân vùng dữ liệu của tôi trong khối, đảm bảo rằng mỗi đoạn sẽ phù hợp với bộ nhớ thiết bị. Sau khi thực hiện các tính toán, tôi đã đọc dữ liệu với clEnqueueReadBuffer(). Tuy nhiên, tại một số điểm tôi nhận ra tôi chỉ có thể sử dụng các dòng sau:

cl_mem buff = clCreateBuffer(cl_ctx, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, object_size, (void*) object, NULL); 

Khi làm điều này, các phân vùng của dữ liệu trở nên lỗi thời. Và trước sự ngạc nhiên của tôi, tôi đã trải qua một sự tăng trưởng tuyệt vời về hiệu suất. Đó là điều tôi không hiểu. Từ những gì tôi nhận được, khi sử dụng một con trỏ máy chủ, bộ nhớ thiết bị đang hoạt động như một bộ nhớ đệm, nhưng tất cả dữ liệu vẫn cần phải được sao chép vào nó để xử lý và sau đó được sao chép trở lại bộ nhớ chính sau khi hoàn tất. Làm thế nào đến bằng cách sử dụng một bản sao rõ ràng (clEnqueRead/WriteBuffer) là một thứ tự của cường độ chậm hơn, khi trong tâm trí của tôi về cơ bản nó sẽ giống nhau? Tui bỏ lỡ điều gì vậy?

Cảm ơn.

Trả lời

2

Có, bạn đang thiếu CL_TRUE trong lệnh gọi clEnqueueWriteBuffer. Điều này làm cho hoạt động ghi chặn, mà ngăn cản CPU trong khi sao chép được thực hiện. Bằng cách sử dụng con trỏ máy chủ, việc thực hiện OpenCL có thể "tối ưu hóa" bản sao bằng cách làm cho nó không đồng bộ, do đó trong tổng thể hiệu suất là tốt hơn.

Lưu ý rằng điều này phụ thuộc vào việc triển khai CL và không đảm bảo sẽ nhanh hơn/bằng/chậm hơn.

+0

Tôi biết cờ chặn trên clEnqueueRead/WriteBuffer. Tuy nhiên khi tôi đã làm các biện pháp, tôi đã sử dụng một clFinish (ít nhất là tôi khá chắc chắn tôi đã làm), mà nên có tác dụng tương tự như cờ chặn, hay không? Đó là, tất nhiên, chỉ khi cùng một lượng dữ liệu được xử lý. Hm, có lẽ việc thực hiện CL là đủ thông minh để rời khỏi phần của một đối tượng không được truy cập (khoảng 70% của nó) ... Cảm ơn anyway! – VHristov

1

Trong một số trường hợp, CPU và GPU có thể chia sẻ cùng một bộ nhớ DRAM vật lý. Ví dụ: nếu khối bộ nhớ đáp ứng các quy tắc căn chỉnh CPU và GPU thì Intel diễn giải CL_MEM_USE_HOST_PTR là quyền chia sẻ DRAM vật lý giữa CPU và GPU, do đó không có sao chép dữ liệu thực tế. Rõ ràng, điều đó rất nhanh!

Dưới đây là một liên kết mà giải thích nó:

https://software.intel.com/en-us/articles/getting-the-most-from-opencl-12-how-to-increase-performance-by-minimizing-buffer-copies-on-intel-processor-graphics

PS Tôi biết trả lời của tôi là quá già cho OP, nhưng độc giả khác có thể quan tâm.