2013-08-31 83 views
6

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ì ?

+0

là mục tiêu của bạn để có một lớp học với hàm _ _global_ _? – 4pie0

+0

"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

+0

Vì vậy, câu trả lời của bạn là:" Nó chỉ là không. "? – JorenHeit

Trả lời

1

may mắn thay, khoảng 4 năm sau khi câu hỏi này đã được hỏi, clang 4.0 can compile the CUDA language Hãy xem xét ví dụ sau:.

class A 
{ 
public: 
    __global__ static void kernel(); 
}; 

__device__ void A::kernel() 
{} 

int main() 
{ 
    A::kernel <<< 1, 1 >>>(); 
}; 

Khi tôi cố gắng biên dịch nó với kêu vang 4.0 , Tôi nhận được lỗi sau:

test.cu:7:1: error: kernel function 'kernel' must be a free function or static member function 
__global__ void A::kernel() 
^ 
/usr/local/cuda/include/host_defines.h:191:9: note: expanded from macro '__global__' 
     __location__(global) 
     ^
/usr/local/cuda/include/host_defines.h:88:9: note: expanded from macro '__location__' 
     __annotate__(a) 
     ^
/usr/local/cuda/include/host_defines.h:86:9: note: expanded from macro '__annotate__' 
     __attribute__((a)) 
     ^
test.cu:7:20: error: __host__ function 'kernel' cannot overload __global__ function 'kernel' 
__global__ void A::kernel() 
       ^
test.cu:4:28: note: previous declaration is here 
    __global__ static void kernel(); 
         ^
2 errors generated. 

Để đáp ứng các lỗi này, tôi đã inlined định nghĩa hạt nhân vào khai báo lớp:

class A 
{ 
public: 
    __global__ static void kernel() 
    { 
     // implementation would go here 
    } 
}; 

Sau đó Clang 4,0 biên dịch nó thành công và nó có thể được thực hiện mà không cần bất kỳ lỗi nào. Vì vậy, điều này rõ ràng không phải là giới hạn của ngôn ngữ CUDA , nhưng trình biên dịch tiêu chuẩn thực tế của nó. Bằng cách này, nvcc có nhiều hạn chế không được điều chỉnh tương tự mà clang không có.

+0

http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#function-members – talonmies

+0

@talonmies Phần [E. Hỗ trợ ngôn ngữ C/C++] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-cplusplus-language-support) của hướng dẫn lập trình chỉ đơn thuần là một đặc tả (một phần) những gì 'nvcc' làm hoặc không hỗ trợ. Nó không có gì để làm với đặc tả ngôn ngữ CUDA, mà tiếc là không tồn tại. [B. Phần mở rộng ngôn ngữ C] (http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#c-language-extensions) phần là gần, nhưng nó được trộn lẫn với 'nvcc' cụ thể và API thời gian chạy CUDA. –