Khi biên dịch mã bên dưới bằng cách sử dụng nvcc (CUDA 5.0), lỗi "sự kết hợp bất hợp pháp của bộ nhớ vòng loại" xuất hiện, vì dường như không thể có hạt nhân toàn cầu trong một lớp.CUDA: Tại sao không thể định nghĩa các hàm thành viên toàn cầu tĩnh?
class A
{
public:
__global__ static void kernel();
};
__global__ void A::kernel()
{}
Tôi có thể hiểu giới hạn này khi giao dịch với các thành viên không tĩnh, nhưng tại sao lỗi vẫn xảy ra khi hạt nhân được khai báo là tĩnh? Việc gọi các thành viên như vậy sẽ không khác với việc gọi hàm khi nó được khai báo trong một không gian tên (A
trong trường hợp này).
A::kernel <<< 1, 1 >>>();
Có lý do nào khiến tôi thiếu lý do tại sao điều này chưa được triển khai chưa?
EDIT: Dựa trên câu trả lời trong cả câu trả lời và nhận xét, tôi chưa đủ rõ ràng về câu hỏi của mình. Câu hỏi của tôi không phải là lý do lỗi xuất hiện. Rõ ràng, điều này là bởi vì nó đã không được thực hiện. Câu hỏi của tôi là lý do tại sao nó chưa được triển khai. Cho đến nay, tôi đã không thể nghĩ ra một lý do khiến tính năng này không được triển khai. Tôi nhận ra rằng tôi có thể đã quên mất một trường hợp đặc biệt mà sẽ làm phức tạp vấn đề, do đó câu hỏi.
Những lý do tôi tin rằng đây là một tính năng hợp lý là:
- Một chức năng tĩnh không có một con trỏ
this
Vì vậy, ngay cả khi kernel được gọi vào một đối tượng sống trên máy chủ, có không có xung đột trong việc truy cập dữ liệu của nó, vì dữ liệu này không thể truy cập được ở nơi đầu tiên (dữ liệu từ đối tượng nào ??). - Bạn có thể tranh luận rằng nếu lớp có dữ liệu tĩnh liên kết với nó, sống trên máy chủ, điều này về nguyên tắc có thể truy cập được từ hạt nhân tĩnh. Tuy nhiên, dữ liệu tĩnh không được hỗ trợ, do đó, một lần nữa không có xung đột.
- Gọi một kernel tĩnh trên một đối tượng trên máy chủ (
A a; a.staticKernel<<<...,...>>>();)
sẽ là hoàn toàn tương đương với gọi nó mà không có đối tượng nào cả (A::staticKernel<<<...,...>>>();
), như chúng ta được sử dụng để ở thường xuyên C++.
tôi đang thiếu gì ?
là mục tiêu của bạn để có một lớp học với hàm _ _global_ _? – 4pie0
"Câu hỏi của tôi là lý do tại sao nó chưa được triển khai. Cho đến nay, tôi đã không thể nghĩ ra lý do khiến tính năng này không được triển khai."- có những điều milion mà có thể được thực hiện nhưng không có nhu cầu như vậy và họ còn lại unimplemented – 4pie0
Vì vậy, câu trả lời của bạn là:" Nó chỉ là không. "? – JorenHeit