2014-11-06 15 views
5

Tôi đang cố gắng phân tích một số mã tôi đã tìm thấy trực tuyến và tôi tiếp tục suy nghĩ mình vào một góc. Tôi đang xem xét hạt nhân histogram được khởi chạy với các tham số sauHiểu về hạt nhân CUDA này khởi động tham số

histogram<<<2500, numBins, numBins * sizeof(unsigned int)>>>(...); 

Tôi biết rằng thông số là lưới, khối, kích thước bộ nhớ dùng chung. Vì vậy, điều đó có nghĩa là có 2500 khối của numBins chủ đề mỗi, mỗi khối cũng có một bộ nhớ chia sẻ có sẵn cho chủ đề của nó là numBins * sizeof(unsigned int) không? Không.

Ngoài ra, trong chính hạt nhân có các cuộc gọi đến __syncthreads(), ở đó có 2500 bộ gọi numBins đến __syncthreads() trong quá trình gọi hạt nhân không?

+2

Câu hỏi đầu tiên: có.Câu hỏi thứ hai: luồng bên trong khối 2500, độc lập với các chuỗi khác, sẽ đạt tới điểm '__syncthreads()', ở lại cho đến khi tất cả các luồng trong khối kết thúc cập nhật của chúng vào bộ nhớ chia sẻ cho đến điểm đó và đến, và sau đó tiếp tục thực hiện thêm hướng dẫn. Tất cả các luồng bên trong khối sẽ phải xem '__syncthreads()' để bạn có thể nói rằng có * 2500 tập hợp các lệnh 'numBins' đến' __syncthreads() '*, nhưng nó khác với lệnh gọi hàm thông thường. Đó là một thói quen hàng rào cho đồng bộ hóa thread trong khối. – Farzad

Trả lời

4

Vì vậy, điều đó có nghĩa rằng có 2500 khối numBins đề mỗi, mỗi khối cũng có một numBins * sizeof (unsigned int) đoạn bộ nhớ chia sẻ có sẵn cho chủ đề của nó?

Từ CUDA Toolkit documentation:

Cấu hình thực hiện (của một cuộc gọi chức năng toàn cầu) được quy định bằng cách chèn một biểu thức có dạng <<<Dg,Db,Ns,S>>>, trong đó:

  • Dg (dim3) chỉ định kích thước và kích thước của lưới.
  • Db (dim3) xác định kích thước và kích thước của mỗi khối
  • Ns (size_t) xác định số byte trong bộ nhớ chia sẻ rằng được cấp phát động mỗi khối cho cuộc gọi này trong Ngoài bộ nhớ được cấp phát tĩnh.
  • S (cudaStream_t) quy định các dòng liên quan, là một tham số tùy chọn mặc định là 0.

Vì vậy, như @Fazar chỉ ra, câu trả lời là có. Bộ nhớ này được cấp phát cho mỗi khối.

Ngoài ra, trong hạt nhân riêng của mình có cuộc gọi đến __syncthreads(), là có thì 2500 bộ numBins cuộc gọi đến __syncthreads() trong nhiên của cuộc gọi hạt nhân?

__syncthreads() đợi cho đến khi tất cả các chuỗi trong chuỗi đã đạt đến điểm này. Được sử dụng để phối hợp giao tiếp giữa các luồng trong cùng một khối.

Vì vậy, có một cuộc gọi __syncthread() mỗi khối.

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