Sự khác nhau giữa chức năng toàn cầu và thiết bị


65

Có ai có thể mô tả sự khác biệt giữa __global____device__ không?

Khi nào tôi nên sử dụng __device__ và khi nào nên sử dụng __global__?.

93

Chức năng toàn cầu cũng được gọi là "hạt nhân". Đó là các hàm mà bạn có thể gọi từ phía máy chủ bằng cách sử dụng ngữ nghĩa gọi hạt nhân CUDA (<<<...>>>).

Chỉ có thể gọi các chức năng thiết bị từ các thiết bị hoặc chức năng toàn cục khác. Không thể gọi hàm __device__ từ mã máy chủ.

+7

Cũng giống như phụ lục, chức năng '__global__' cũng có thể được gọi từ thiết bị sử dụng ngữ nghĩa hạt nhân CUDA (<<<...> >>) nếu bạn đang sử dụng song song động - yêu cầu CUDA 5.0 và khả năng tính toán 3.5 trở lên. 11 sep. 122012-09-11 17:44:18


10

__global__ là dành cho hạt nhân cuda, các chức năng có thể gọi trực tiếp từ máy chủ. Các chức năng __device__ có thể được gọi từ các hàm __global____device__ nhưng không được gọi từ máy chủ.


28

Sự khác nhau giữa __device____global__ chức năng bao gồm:

__device__ chức năng có thể được gọi là chỉ từ thiết bị, và nó được thực hiện chỉ trong thiết bị. Các chức năng

__global__ có thể được gọi từ máy chủ, và nó được thực hiện trong thiết bị.

Vì vậy, bạn gọi hàm __device__ từ các hàm hạt nhân và bạn không phải đặt cài đặt hạt nhân. Bạn cũng có thể "quá tải" một hàm, ví dụ: bạn có thể khai báo void foo(void)__device__ foo (void), sau đó một hàm được thực thi trên máy chủ và chỉ có thể được gọi từ một hàm chủ. Người kia được thực hiện trên thiết bị và chỉ có thể được gọi từ một thiết bị hoặc chức năng hạt nhân.

Bạn cũng có thể truy cập liên kết sau: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions, nó hữu ích cho tôi.


12

tôi sẽ giải thích nó với một ví dụ:

main() 
{ 
    // Your main function. Executed by CPU 
} 

__global__ void calledFromCpuForGPU(...) 
{ 
    //This function is called by CPU and suppose to be executed on GPU 
} 

__device__ void calledFromGPUforGPU(...) 
{ 
    // This function is called by GPU and suppose to be executed on GPU 
} 

tức là khi chúng ta muốn có một chức năng máy chủ (CPU) để gọi một chức năng thiết bị (GPU), sau đó 'toàn cầu' được sử dụng. Đọc: "https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions"

Và khi chúng tôi muốn một chức năng (GPU) thiết bị (thay vì hạt nhân) gọi một hàm hạt nhân khác, chúng tôi sử dụng 'device'. Đọc "https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions"

Điều này cũng đủ để hiểu sự khác biệt.


5

__global__ là định nghĩa của hạt nhân. Bất cứ khi nào nó được gọi từ CPU, hạt nhân đó được khởi chạy trên GPU.

Tuy nhiên mỗi luồng thực thi hạt nhân đó, có thể yêu cầu thực thi một số mã lặp lại, ví dụ như hoán đổi hai số nguyên. Vì vậy, ở đây chúng ta có thể viết một hàm trợ giúp, giống như chúng ta làm trong một chương trình C. Và đối với các chuỗi chạy trên GPU, một hàm trợ giúp phải được khai báo là __device__.

Do đó, một chức năng thiết bị được gọi từ các luồng của hạt nhân - một phiên bản cho một chuỗi. Trong khi, một chức năng toàn cầu được gọi là từ chuỗi CPU.


6

Tôi đang ghi hình một số suy đoán vô căn cứ ở đây trong thời gian này (Tôi sẽ chứng minh những sau khi tôi đi qua một số nguồn có thẩm quyền) ...

  1. __device__ chức năng có thể có một kiểu trả về khác hơn là khoảng trống nhưng Các hàm __global__ luôn phải trả về giá trị rỗng.

  2. __global__ chức năng có thể được gọi từ bên trong hạt nhân khác đang chạy trên GPU để khởi động đề GPU bổ sung (như một phần của CUDA mô hình xử lý song song động (aka CNP)) trong khi __device__ chức năng chạy trên cùng một sợi như kernel gọi.


2

Chức năng toàn cầu chỉ có thể được gọi từ máy chủ và họ không có một kiểu trả về trong khi chức năng Device chỉ có thể được gọi từ chức năng hạt nhân của chức năng Device khác do đó doesnt cần thiết kernel


5

__golbal__ là một từ khóa CUDA C (khai specifier) ​​mà nói rằng chức năng,

  1. Thực thi trên thiết bị (GPU)
  2. cuộc gọi từ máy chủ (CPU) mã.

chức năng toàn cầu (kernel) đưa ra bởi các mã chủ sử dụng < < < no_of_blocks, no_of threads_per_block >>>. Mỗi luồng thực hiện hạt nhân theo id chuỗi duy nhất của nó.

Nhưng __device__ chức năng không thể được gọi từ máy chủ code.if bạn cần phải làm điều đó sử dụng cả hai __host____device__


11
  1. __global__ - Chạy trên GPU, gọi từ CPU. Đã thực hiện với các đối số <<<dim3>>>.
  2. __device__ - Chạy trên GPU, được gọi từ GPU. Có thể được sử dụng với variabiles quá.
  3. __host__ - Chạy trên CPU, được gọi từ CPU.
+1

Câu trả lời này hơi muộn - nó đã chính xác tại thời điểm câu hỏi được hỏi, nhưng nó không chính xác nữa kể từ khi phát minh [song song động] (https://devblogs.nvidia.com/parallelforall/introduction-cuda - song song -namnamic /). 12 sep. 162016-09-12 11:47:03