2012-06-20 42 views
5

Tôi mới sử dụng Lực đẩy và có một điều tôi không hiểu. Là lực đẩy không đồng bộ hoặc đồng bộ?Là lực đẩy đồng bộ hoặc không đồng bộ?

Nếu tôi viết mã sau, thời gian thực hiện không phải là 0. Nhưng trong các thẻ khác, người dùng khác báo cáo kết quả là 0. Sự thật là gì?

clock_t start,end; 

start=clock(); 
thrust::sort_by_key(vettore.begin(), vettore.end(), counter.begin()); 

end=clock(); 

double time=((double)(end-start))/CLOCKS_PER_SEC; 

cout<<"execution time"<<time<<endl;// the result is 0.327 
+0

Lưu ý: câu hỏi có liên quan trên diễn đàn NVIDIA [ở đây] (https://devtalk.nvidia.com/default/topic/864759/is-thrust-copy-synchrous-or-asynchronus-/). – BenC

Trả lời

2

Khởi chạy hạt nhân luôn không đồng bộ - ngay cả trong CUDA 1.0 - vì vậy, bất kỳ lệnh gọi nào chỉ kết quả trong khởi chạy hạt nhân sẽ không đồng bộ.

Bất kỳ mã lực đẩy nào kích hoạt ngầm memcpy sẽ đồng bộ do thiếu sự hỗ trợ luồng, như được cho là bởi marina.k.

+3

Ví dụ, lực đẩy :: reduce() chắc chắn là đồng bộ vì nó đọc lại kết quả và trả về chuỗi gọi qua giá trị trả về. Tôi đưa ra một số nhận xét về những giới hạn này trong bài đăng trên blog gần đây của tôi trên Thrust: http://developer.nvidia.com/content/expressive-algorithmic-programming-thrust – harrism

0

độ chi tiết của hàm clock() không tốt như bạn nghĩ trong Windows. Và trong Windows XP, độ chi tiết của nó cao tới 16msec.

Thay vì sử dụng đồng hồ() sử dụng bộ hẹn giờ có độ phân giải cao hoặc chức năng định thời của thư viện Cutil (thường được ưu tiên).

Thảo luận về timer có độ phân giải cao trong Windows: C++ high precision time measurement in Windows

Thảo luận về việc sử dụng CUtil thư viện cho thời gian: CUDA: CUtil timer - confusion on elapsed time

0

bạn có thể làm điều đó tự thêm các time.h để indexer, vào Preferences - > C/C++ -> Trình lập chỉ mục và đặt nó ở phía trước "Tệp được lập chỉ mục trước" hiện có như sau:

time.h, cstdarg, stdarg.h, ..... 

nó sẽ hoạt động

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