2012-08-14 24 views
7

Câu hỏi này có liên quan đến sử dụng các luồng CUDA để chạy nhiều hạt nhânLàm thế nào để giảm CUDA đồng bộ hóa độ trễ/trì hoãn

Trong CUDA có lệnh nhiều đồng bộ cudaStreamSynchronize, CudaDeviceSynchronize, cudaThreadSynchronize, và cũng cudaStreamQuery để kiểm tra xem luồng trống.

Tôi nhận thấy khi sử dụng profiler các lệnh đồng bộ hóa này giới thiệu độ trễ lớn cho chương trình. Tôi đã tự hỏi nếu có ai biết bất kỳ phương tiện để giảm độ trễ này ngoài tất nhiên bằng cách sử dụng như lệnh đồng bộ hóa ít nhất có thể.

Cũng có bất kỳ số liệu nào để đánh giá phương thức đồng bộ hiệu quả nhất. đó là xem xét 3 dòng được sử dụng trong một ứng dụng và hai trong số họ cần phải hoàn thành cho tôi để khởi động một dòng ra nên tôi sử dụng 2 cudaStreamSyncs hoặc chỉ một cudaDeviceSync những gì sẽ phải chịu ít mất?

+1

cudaThreadSynchronize không được dùng nữa. –

Trả lời

8

Sự khác biệt chính giữa các phương pháp đồng bộ hóa là "bỏ phiếu" và "chặn".

"Bỏ phiếu" là cơ chế mặc định để trình điều khiển chờ GPU - nó chờ vị trí bộ nhớ 32 bit để đạt được giá trị nhất định được viết bởi GPU. Nó có thể trở lại chờ đợi nhanh hơn sau khi chờ đợi được giải quyết, nhưng trong khi chờ đợi, nó sẽ đốt cháy một lõi CPU nhìn vào vị trí bộ nhớ đó.

"Chặn" có thể được yêu cầu bằng cách gọi cudaSetDeviceFlags() với cudaDeviceScheduleBlockingSync hoặc gọi cudaEventCreate() với cudaEventBlockingSync. Chặn chờ đợi gây ra trình điều khiển để chèn một lệnh vào bộ đệm lệnh DMA báo hiệu một ngắt khi tất cả các lệnh trước đó trong bộ đệm đã được thực hiện. Trình điều khiển sau đó có thể ánh xạ gián đoạn tới một sự kiện Windows hoặc xử lý tệp Linux, cho phép các lệnh đồng bộ hóa đợi mà không cần phải ghi CPU liên tục, cũng như các phương thức thăm dò mặc định.

Các truy vấn về cơ bản là kiểm tra thủ công vị trí bộ nhớ 32 bit được sử dụng để bỏ phiếu chờ đợi; vì vậy trong hầu hết các trường hợp, chúng rất rẻ. Nhưng nếu ECC được bật, truy vấn sẽ đi sâu vào chế độ hạt nhân để kiểm tra xem có lỗi ECC nào không; và trên Windows, mọi lệnh đang chờ xử lý sẽ được chuyển sang trình điều khiển (yêu cầu phải có một hạt nhân).

+0

Có vẻ như sự khác biệt giữa bỏ phiếu và chặn là việc bỏ phiếu sẽ làm cháy thời gian CPU và Chặn không. Tuy nhiên không có sự khác biệt về thời gian thực hiện để đồng bộ hóa xảy ra. Trong một tình huống mà không có công việc phải được thực hiện bởi CPU, họ giảm đến cùng một điều. Đúng không ? – shadow

+0

Có thể có sự khác biệt về thời gian, vì việc xử lý ngắt làm tăng thêm độ trễ. Vì vậy, để đổi lấy việc không đốt CPU trên phiếu thăm dò ý kiến, bạn phải trả theo hình thức của một thời gian dài hơn giữa chờ đợi được giải quyết và các chủ đề nhận được bỏ chặn như là một kết quả. – ArchaeaSoftware

+0

Nhưng sự khác nhau giữa 'cudaDeviceScheduleBlockingSync' và' cudaDeviceScheduleYield' là gì? 'cudaDeviceScheduleYield' như được viết:" Hướng dẫn CUDA tạo ra chuỗi của nó khi đợi kết quả từ thiết bị. Điều này có thể tăng độ trễ khi chờ thiết bị, nhưng có thể tăng hiệu suất của các luồng CPU hoạt động song song với thiết bị. " - tức là kết quả chờ ** mà không cần ghi CPU đang quay ** - tức là "Chặn". Và 'cudaDeviceScheduleBlockingSync' quá - chờ kết quả mà không cần đốt CPU trong spin. Nhưng có gì khác biệt? – Alex