2012-03-30 31 views

Trả lời

26

Thật không may bạn không thể gọi các chức năng trong thiết bị không được chỉ định với __device__ công cụ sửa đổi. Nếu bạn cần trong số ngẫu nhiên trong mã thiết bị nhìn vào máy phát điện ngẫu nhiên CUDA curandhttp://developer.nvidia.com/curand

Nếu bạn có chức năng máy chủ của riêng bạn mà bạn muốn gọi từ một sử dụng kernel cả __host____device__ sửa đổi trên nó:

__host__ __device__ int add(int a, int b) 
{ 
    return a + b; 
} 

Khi tệp này được trình biên dịch trình điều khiển NVCC biên dịch, hai phiên bản của các hàm được biên dịch: một phiên bản có thể gọi bằng mã máy chủ và một mã khác có thể gọi bằng mã thiết bị. Và đây là lý do tại sao chức năng này bây giờ có thể được gọi cả bởi máy chủ và mã thiết bị.

+1

Hạ cấp hiệu suất trong khi gọi chức năng lưu trữ thay vì sử dụng chức năng tích hợp sẵn trong cuda? – Mattia

+0

Điều này có nghĩa là máy chủ và thiết bị sẽ chỉ thực thi các bản sao chức năng tương ứng của riêng chúng? – avgvstvs

5

Mặc dù không áp dụng đối với 'rand()' nhưng một vài chức năng máy chủ như "printf" có sẵn khi biên dịch với khả năng tương thích tính toán> = 2.0

ví dụ:

nvcc.exe -gencode=arch=compute_10,code=\sm_10,compute_10\... 
error : calling a host function("printf") from a __device__/__global__ function("myKernel") is not allowed 

biên dịch và làm việc với sm_20 , compute_20

7

Câu trả lời ngắn gọn là ở đây không có giải pháp cho vấn đề đó.

Mọi thứ thường chạy trên CPU phải được điều chỉnh cho môi trường CUDA mà không có bất kỳ đảm bảo nào thậm chí có thể thực hiện được. Các chức năng của máy chủ chỉ là một tên khác trong CUDA cho các hàm C bình thường. Đó là, các chức năng chạy trên kiến ​​trúc Von Neumann của bộ nhớ CPU giống như tất cả C/C++ đã được tính đến thời điểm này trong PC. GPU cung cấp cho bạn một lượng lớn sức mạnh tính toán nhưng chi phí là nó không gần như linh hoạt hoặc tương thích. Quan trọng nhất, các chức năng chạy mà không có khả năng truy cập bộ nhớ chính và bộ nhớ mà chúng có thể truy cập bị hạn chế.

Nếu những gì bạn đang cố gắng có được là một trình tạo số ngẫu nhiên, bạn đang gặp may khi Nvidia gặp rắc rối khi triển khai Mersenne Twister hiệu quả cao có thể hỗ trợ tới 256 luồng trên mỗi SMP. Nó có thể gọi bên trong một chức năng thiết bị, được mô tả trong một bài viết trước đây của tôi here. Nếu bất kỳ ai tìm thấy liên kết tốt hơn mô tả chức năng này, hãy xóa tên của tôi và thay thế văn bản thích hợp tại đây cùng với liên kết.

Một điều tôi liên tục ngạc nhiên là có bao nhiêu lập trình viên dường như không biết làm thế nào các máy phát số giả ngẫu nhiên chuẩn hóa chất lượng cao. "Lăn riêng của bạn" thực sự không phải là một ý tưởng hay khi xem xét bao nhiêu số giả ngẫu nhiên nghệ thuật. Kiểm tra một máy phát điện như cung cấp số lượng chấp nhận được không thể đoán trước mất rất nhiều công việc và tài năng học tập ...

-1

tôi phải đồng ý với một số các câu trả lời khác theo nghĩa sau:

OP không mô tả một vấn đề : nó không phải là không may rằng bạn không thể gọi __host__ chức năng từ mã thiết bị - nó là hoàn toàn không thể cho nó được bất kỳ cách nào khác, và đó không phải là một điều xấu.

Để giải thích: Hãy suy nghĩ về mã máy chủ (CPU) như một đĩa CD mà bạn đưa vào đầu đĩa CD; và trên mã thiết bị như một thẻ SD mà bạn đã đưa vào một trình phát nhạc thu nhỏ.Câu hỏi của OP là "làm thế nào tôi có thể đưa đĩa vào máy nghe nhạc thu nhỏ của tôi"? Bạn không thể, và nó không có ý nghĩa để muốn. Nó có thể là cùng một bản chất âm nhạc (mã với cùng chức năng; mặc dù thông thường, mã máy chủ và mã thiết bị không thực hiện nhiệm vụ tính toán tương tự) - nhưng các phương tiện truyền thông không thể hoán đổi cho nhau.

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