2012-09-20 10 views
6

Tôi đang cố chạy hạt nhân trên GPU và thực hiện tính toán bổ sung trên máy chủ (CPU). Tôi thấy hiệu ứng này:Thực thi hạt nhân OpenCL không bắt đầu cho đến khi clFinish hoặc clWaitForEvents được gọi là

chỉ hạt nhân cần khoảng 2000 ms:

clEnqueueNDRangeKernel ...

clFinish (hoặc clWaitForEvents, tôi đã cố gắng cả hai)

tôi mô phỏng tính toán thêm trên CPU có chế độ ngủ (10):

clEnqueueNDRangeKernel ...

ngủ (10);

clFinish (hoặc clWaitForEvents)

Về lý thuyết hạt nhân nên chạy trên GPU và sau khi ngủ 10 giây hạt nhân nên được kết thúc. Nhưng đo thời gian cho biết tất cả đều cần 12000ms thay vì 10000.

ClFinish hoặc clWaitForEvents có gọi hạt nhân khởi động hoặc tôi bỏ lỡ thứ gì đó không?

Tôi đang sử dụng CPU AMD Fusion/GPU trên Linux.

Cảm ơn rất nhiều.

+0

Dữ liệu của bạn lớn đến mức nào? Có thể là 2000ms thể hiện thời gian cần thiết để chuyển dữ liệu của bạn từ GPU sang CPU? – user1202136

+0

Dữ liệu dưới 1 MB. Nhưng nó không phải là đo lường của tôi. Tôi sao chép dữ liệu vào thiết bị, bắt đầu đo, thực hiện hạt nhân + ngủ + clFinish, dừng đo, sao chép dữ liệu trở lại máy chủ – Tomas

+0

Bạn đo chính xác như thế nào? Bạn có sao chép dữ liệu của mình vào thiết bị một cách đồng bộ không? – reima

Trả lời

2

clFinish() chỉ đảm bảo rằng hạt nhân đã được hoàn thành khi chương trình tiến về phía trước chức năng này, nhưng khi hạt nhân sẽ được bắt đầu thực hiện là không chắc chắn. clFlush() có thể đảm bảo rằng hạt nhân đã được khởi động trên thiết bị trong khi chương trình tiến hành trước câu lệnh clFlush(), nhưng khi nó được hoàn thành thì không chắc chắn, vì vậy bạn cần clFlush() để đảm bảo hạt nhân đã được khởi chạy trên thiết bị, sau đó thời gian (2000ms) có thể bị chồng chéo bởi thời gian ngủ (10000ms) ở cuối máy chủ. Hy vọng nó có thể hữu ích.