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


108

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

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

Câu trả lời:


136

Các hàm toàn cục còn đượ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 ( <<<...>>>).

Các chức năng của thiết bị chỉ có thể được gọi từ thiết bị khác hoặc các chức năng chung. __device__không thể gọi hàm từ mã máy chủ.


14
Cũng giống như một phần phụ, các __global__hàm cũng có thể được gọi từ thiết bị bằ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.
Tom

39

Sự khác biệt giữa __device__và các __global__chức năng là:

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

__global__ các hàm có thể được gọi từ máy chủ lưu trữ và nó được thực thi trong thiết bị.

Do đó, bạn gọi các __device__hàm từ các hàm của hạt nhân và bạn không phải thiết lập 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 máy chủ. Cái kia được thực thi 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ó rất hữu ích cho tôi.


31
  1. __global__- Chạy trên GPU, được gọi từ CPU hoặc GPU *. Thực thi với các <<<dim3>>>đối số.
  2. __device__- Chạy trên GPU, được gọi từ GPU. Cũng có thể được sử dụng với các tệp biến thể.
  3. __host__ - Chạy trên CPU, được gọi từ CPU.

*) Các __global__hàm có thể được gọi từ các __global__hàm khác bắt đầu
khả năng tính toán 3.5.


5
Câu trả lời này hơi muộn - nó đã đúng vào thời điểm câu hỏi được đặt ra, nhưng nó không còn đúng nữa kể từ khi phát minh ra song song động .
tera

16

Tôi sẽ giải thích nó bằng 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 một hàm máy chủ (CPU) gọi một hàm thiết bị (GPU), thì ' toàn cầu ' được sử dụng. Đọc phần này: " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions "

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

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


13

__global__dành cho hạt nhân cuda, các hàm có thể gọi trực tiếp từ máy chủ. __device__các hàm có thể được gọi từ __global__và các __device__hàm nhưng không được gọi từ máy chủ.


7

Tôi đang ghi lại một số suy đoán vô căn cứ ở đây vào lúc này (tôi sẽ chứng minh những điều này sau khi tôi bắt gặp một số nguồn có thẩm quyền) ...

  1. __device__các hàm có thể có kiểu trả về khác với void nhưng các __global__hàm phải luôn trả về void.

  2. __global__các chức năng có thể được gọi từ bên trong các nhân khác chạy trên GPU để khởi chạy các luồng GPU bổ sung (như một phần của mô hình song song động CUDA (hay còn gọi là CNP)) trong khi các __device__chức năng chạy trên cùng một luồng với nhân đang gọi.


7

__global__function là định nghĩa của kernel. Bất cứ khi nào nó được gọi từ CPU, nhân đó sẽ đượ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 đi 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 helper, giống như chúng ta làm trong chương trình C. Và đối với các luồng thực thi trên GPU, một hàm trợ giúp nên được khai báo là __device__.

Do đó, một hàm thiết bị được gọi từ các luồng của nhân - một thể hiện cho một luồng. Trong khi, một hàm toàn cục được gọi từ luồng CPU.


7

__global__ là một từ khóa CUDA C (chỉ định khai báo) cho biết rằng hàm,

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

các hàm toàn cục (hạt nhân) do mã máy chủ khởi chạy bằng cách sử dụng <<< no_of_blocks , no_of threads_per_block>>>. Mỗi luồng thực thi hạt nhân bằng id luồng duy nhất của nó.

Tuy nhiên, các __device__hàm không thể được gọi từ mã máy chủ. Nếu bạn cần thực hiện, hãy sử dụng cả hai __host__ __device__.


2

Chức năng toàn cục chỉ có thể được gọi từ máy chủ lưu trữ và chúng không có kiểu trả về trong khi Chức năng thiết bị chỉ có thể được gọi từ chức năng nhân của chức năng Thiết bị khác do đó không yêu cầu thiết lập nhân

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.