2011-12-24 9 views
5

Tôi đang làm như sau:initializer không được phép cho __shared__ biến cho CUDA

__shared__ int exForBlockLessThanP = totalElementLessThanPivotEntireBlock[blockIdx.x]; 

nơi totalElementLessThanPivotEntireBlock là một mảng trên GPU. Trình biên dịch được ném như lỗi như đã nêu trong tiêu đề của câu hỏi. Tôi thực sự không hiểu tại sao đây là một vấn đề?

Trả lời

7

Khởi tạo tĩnh các biến được chia sẻ là bất hợp pháp trong CUDA. Vấn đề là các ngữ nghĩa về cách mọi luồng nên xử lý khởi tạo tĩnh của bộ nhớ chia sẻ là không xác định trong mô hình lập trình. Chủ đề nào nên viết? Điều gì sẽ xảy ra nếu giá trị không đồng đều giữa các luồng? Trình biên dịch sẽ phát ra mã như thế nào cho một trường hợp như vậy và phần cứng sẽ chạy nó như thế nào?

Trong ví dụ vô nghĩa của bạn, bạn đang yêu cầu mỗi chuỗi trong khối khởi tạo cùng một biến được chia sẻ với một giá trị - về cơ bản là một cuộc đua bộ nhớ được biên dịch tĩnh.

+1

SO, phương pháp phù hợp là gì ??? – Programmer

+0

Xin lưu ý. Ở trên, tôi yêu cầu mỗi thread trong khối gán giá trị exForBlockLessThanp cùng một giá trị – Programmer

+0

Sử dụng câu lệnh có điều kiện để có một luồng làm khởi tạo ở đầu hạt nhân – talonmies