Bất cứ ai có thể mô tả sự khác biệt giữa __global__
và __device__
?
Khi nào tôi nên sử dụng __device__
, và sử dụng khi __global__
nào ?.
Bất cứ ai có thể mô tả sự khác biệt giữa __global__
và __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:
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ủ.
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)
và __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.
__global__
- Chạy trên GPU, được gọi từ CPU hoặc GPU *. Thực thi với các <<<dim3>>>
đối số.__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ể.__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.
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.
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) ...
__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.
__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.
__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.
__global__
là một từ khóa CUDA C (chỉ định khai báo) cho biết rằng hàm,
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__
.
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
__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.