ความแตกต่างระหว่างฟังก์ชันทั่วโลกและอุปกรณ์


คำตอบ:


137

ฟังก์ชันส่วนกลางเรียกอีกอย่างว่า "kernels" เป็นฟังก์ชันที่คุณสามารถเรียกใช้จากฝั่งโฮสต์โดยใช้ CUDA kernel call semantics ( <<<...>>>)

ฟังก์ชันของอุปกรณ์สามารถเรียกใช้ได้จากอุปกรณ์อื่นหรือฟังก์ชันส่วนกลางเท่านั้น __device__ไม่สามารถเรียกใช้ฟังก์ชันจากรหัสโฮสต์


14
เช่นเดียวกับภาคผนวก, __global__ฟังก์ชั่นนี้ยังสามารถเรียกใช้จากอุปกรณ์โดยใช้ CUDA หมายเคอร์เนล (<<< >>> ... ) ถ้าคุณกำลังใช้ขนานแบบไดนามิก - ที่ต้อง CUDA 5.0 และความสามารถในการประมวลผล 3.5 หรือสูงกว่า
ทอม

39

ความแตกต่างระหว่าง__device__และ__global__ฟังก์ชันคือ:

__device__ สามารถเรียกใช้ฟังก์ชันได้จากอุปกรณ์เท่านั้นและจะดำเนินการในอุปกรณ์เท่านั้น

__global__ สามารถเรียกฟังก์ชันจากโฮสต์และดำเนินการในอุปกรณ์

ดังนั้นคุณจึงเรียก__device__ใช้ฟังก์ชันจากฟังก์ชันเคอร์เนลและคุณไม่จำเป็นต้องตั้งค่าเคอร์เนล นอกจากนี้คุณยังสามารถ "โอเวอร์โหลด" ฟังก์ชันได้เช่นคุณสามารถประกาศvoid foo(void)และ__device__ foo (void)จากนั้นฟังก์ชันหนึ่งจะถูกเรียกใช้งานบนโฮสต์และสามารถเรียกใช้จากฟังก์ชันโฮสต์เท่านั้น อีกเครื่องหนึ่งถูกเรียกใช้งานบนอุปกรณ์และสามารถเรียกใช้ได้จากอุปกรณ์หรือฟังก์ชันเคอร์เนลเท่านั้น

คุณสามารถไปที่ลิงค์ต่อไปนี้: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctionsมันมีประโยชน์สำหรับฉัน


32
  1. __global__- ทำงานบน GPU ที่เรียกจาก CPU หรือ GPU * ดำเนินการโดยมี<<<dim3>>>ข้อโต้แย้ง
  2. __device__- ทำงานบน GPU ที่เรียกจาก GPU สามารถใช้กับตัวแปรได้เช่นกัน
  3. __host__ - ทำงานบน CPU ที่เรียกจาก CPU

*) __global__สามารถเรียก__global__ใช้ฟังก์ชันจากฟังก์ชันอื่น ๆ ที่เริ่มต้น
ความสามารถในการคำนวณ 3.5


5
คำตอบนี้เป็นบิตสายเกินไป - มันถูกต้องในเวลาที่คำถามที่ถูกถาม แต่มันไม่ถูกต้องอีกต่อไปตั้งแต่การประดิษฐ์ของขนานแบบไดนามิก
Tera

16

ฉันจะอธิบายด้วยตัวอย่าง:

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
}

เช่นเมื่อเราต้องการให้ฟังก์ชันโฮสต์ (CPU) เรียกใช้ฟังก์ชันอุปกรณ์ (GPU) จากนั้นจะใช้' global ' อ่านสิ่งนี้: " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialGlobalFunctions "

และเมื่อเราต้องการให้ฟังก์ชันอุปกรณ์ (GPU) (แทนเคอร์เนล) เรียกใช้ฟังก์ชันเคอร์เนลอื่นเราก็ใช้ ' อุปกรณ์ ' อ่าน " https://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctions "

นี่น่าจะเพียงพอที่จะเข้าใจความแตกต่าง


13

__global__ใช้สำหรับเมล็ด cuda ซึ่งเป็นฟังก์ชันที่สามารถเรียกใช้ได้จากโฮสต์โดยตรง __device__สามารถเรียกใช้ฟังก์ชันจาก__global__และ__device__ฟังก์ชันได้ แต่ไม่ใช่จากโฮสต์


7

ฉันกำลังบันทึกการคาดเดาที่ไม่มีมูลความจริงไว้ที่นี่ในขณะนี้ (ฉันจะยืนยันสิ่งเหล่านี้ในภายหลังเมื่อฉันเจอแหล่งข้อมูลที่เชื่อถือได้) ...

  1. __device__ฟังก์ชันสามารถมีผลตอบแทนประเภทอื่นที่ไม่ใช่โมฆะ แต่__global__ฟังก์ชันจะต้องคืนค่าเป็นโมฆะเสมอ

  2. __global__ฟังก์ชันสามารถเรียกใช้จากภายในเคอร์เนลอื่นที่ทำงานบน GPU เพื่อเปิดเธรด GPU เพิ่มเติม (เป็นส่วนหนึ่งของ CUDA dynamic parallelism model (aka CNP)) ในขณะที่__device__ฟังก์ชันทำงานบนเธรดเดียวกับเคอร์เนลการเรียก


7

__global__ฟังก์ชันคือคำจำกัดความของเคอร์เนล เมื่อใดก็ตามที่ถูกเรียกใช้จาก CPU เคอร์เนลนั้นจะถูกเปิดใช้งานบน GPU

อย่างไรก็ตามแต่ละเธรดที่รันเคอร์เนลนั้นอาจจำเป็นต้องเรียกใช้โค้ดบางอย่างซ้ำแล้วซ้ำอีกเช่นการสลับจำนวนเต็มสองจำนวน ดังนั้นที่นี่เราสามารถเขียนฟังก์ชันตัวช่วยได้เช่นเดียวกับที่เราทำในโปรแกรม C และสำหรับเธรดที่ทำงานบน GPU ควรประกาศฟังก์ชันตัวช่วยเป็น__device__.

ดังนั้นฟังก์ชันอุปกรณ์จึงถูกเรียกใช้จากเธรดของเคอร์เนล - หนึ่งอินสแตนซ์สำหรับหนึ่งเธรด ในขณะที่ฟังก์ชันส่วนกลางถูกเรียกใช้จากเธรด CPU


7

__global__ คือคีย์เวิร์ด CUDA C (ตัวระบุการประกาศ) ซึ่งระบุว่าฟังก์ชัน

  1. ดำเนินการบนอุปกรณ์ (GPU)
  2. โทรจากรหัสโฮสต์ (CPU)

ฟังก์ชั่นส่วนกลาง (kernels) ที่เปิดใช้โดยรหัสโฮสต์โดยใช้<<< no_of_blocks , no_of threads_per_block>>>. แต่ละเธรดดำเนินการเคอร์เนลโดยใช้เธรด id เฉพาะ

อย่างไรก็ตาม__device__ไม่สามารถเรียกใช้ฟังก์ชันจากรหัสโฮสต์ได้หากคุณจำเป็นต้องใช้ทั้งสอง__host__ __device__อย่าง


2

Global Function สามารถเรียกได้จากโฮสต์เท่านั้นและไม่มีประเภทการส่งคืนในขณะที่ Device Function สามารถเรียกได้จากฟังก์ชันเคอร์เนลของฟังก์ชัน Device อื่น ๆ เท่านั้นจึงไม่จำเป็นต้องมีการตั้งค่าเคอร์เนล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.