ใครสามารถอธิบายความแตกต่างระหว่าง__global__
และ__device__
?
ควรใช้__device__
เมื่อใดและควรใช้เมื่อ__global__
ใด
ใครสามารถอธิบายความแตกต่างระหว่าง__global__
และ__device__
?
ควรใช้__device__
เมื่อใดและควรใช้เมื่อ__global__
ใด
คำตอบ:
ฟังก์ชันส่วนกลางเรียกอีกอย่างว่า "kernels" เป็นฟังก์ชันที่คุณสามารถเรียกใช้จากฝั่งโฮสต์โดยใช้ CUDA kernel call semantics ( <<<...>>>
)
ฟังก์ชันของอุปกรณ์สามารถเรียกใช้ได้จากอุปกรณ์อื่นหรือฟังก์ชันส่วนกลางเท่านั้น __device__
ไม่สามารถเรียกใช้ฟังก์ชันจากรหัสโฮสต์
ความแตกต่างระหว่าง__device__
และ__global__
ฟังก์ชันคือ:
__device__
สามารถเรียกใช้ฟังก์ชันได้จากอุปกรณ์เท่านั้นและจะดำเนินการในอุปกรณ์เท่านั้น
__global__
สามารถเรียกฟังก์ชันจากโฮสต์และดำเนินการในอุปกรณ์
ดังนั้นคุณจึงเรียก__device__
ใช้ฟังก์ชันจากฟังก์ชันเคอร์เนลและคุณไม่จำเป็นต้องตั้งค่าเคอร์เนล นอกจากนี้คุณยังสามารถ "โอเวอร์โหลด" ฟังก์ชันได้เช่นคุณสามารถประกาศvoid foo(void)
และ__device__ foo (void)
จากนั้นฟังก์ชันหนึ่งจะถูกเรียกใช้งานบนโฮสต์และสามารถเรียกใช้จากฟังก์ชันโฮสต์เท่านั้น อีกเครื่องหนึ่งถูกเรียกใช้งานบนอุปกรณ์และสามารถเรียกใช้ได้จากอุปกรณ์หรือฟังก์ชันเคอร์เนลเท่านั้น
คุณสามารถไปที่ลิงค์ต่อไปนี้: http://code.google.com/p/stanford-cs193g-sp2010/wiki/TutorialDeviceFunctionsมันมีประโยชน์สำหรับฉัน
__global__
- ทำงานบน GPU ที่เรียกจาก CPU หรือ GPU * ดำเนินการโดยมี<<<dim3>>>
ข้อโต้แย้ง__device__
- ทำงานบน GPU ที่เรียกจาก GPU สามารถใช้กับตัวแปรได้เช่นกัน__host__
- ทำงานบน CPU ที่เรียกจาก CPU*) __global__
สามารถเรียก__global__
ใช้ฟังก์ชันจากฟังก์ชันอื่น ๆ ที่เริ่มต้น
ความสามารถในการคำนวณ 3.5
ฉันจะอธิบายด้วยตัวอย่าง:
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 "
นี่น่าจะเพียงพอที่จะเข้าใจความแตกต่าง
__global__
ใช้สำหรับเมล็ด cuda ซึ่งเป็นฟังก์ชันที่สามารถเรียกใช้ได้จากโฮสต์โดยตรง __device__
สามารถเรียกใช้ฟังก์ชันจาก__global__
และ__device__
ฟังก์ชันได้ แต่ไม่ใช่จากโฮสต์
ฉันกำลังบันทึกการคาดเดาที่ไม่มีมูลความจริงไว้ที่นี่ในขณะนี้ (ฉันจะยืนยันสิ่งเหล่านี้ในภายหลังเมื่อฉันเจอแหล่งข้อมูลที่เชื่อถือได้) ...
__device__
ฟังก์ชันสามารถมีผลตอบแทนประเภทอื่นที่ไม่ใช่โมฆะ แต่__global__
ฟังก์ชันจะต้องคืนค่าเป็นโมฆะเสมอ
__global__
ฟังก์ชันสามารถเรียกใช้จากภายในเคอร์เนลอื่นที่ทำงานบน GPU เพื่อเปิดเธรด GPU เพิ่มเติม (เป็นส่วนหนึ่งของ CUDA dynamic parallelism model (aka CNP)) ในขณะที่__device__
ฟังก์ชันทำงานบนเธรดเดียวกับเคอร์เนลการเรียก
__global__
ฟังก์ชันคือคำจำกัดความของเคอร์เนล เมื่อใดก็ตามที่ถูกเรียกใช้จาก CPU เคอร์เนลนั้นจะถูกเปิดใช้งานบน GPU
อย่างไรก็ตามแต่ละเธรดที่รันเคอร์เนลนั้นอาจจำเป็นต้องเรียกใช้โค้ดบางอย่างซ้ำแล้วซ้ำอีกเช่นการสลับจำนวนเต็มสองจำนวน ดังนั้นที่นี่เราสามารถเขียนฟังก์ชันตัวช่วยได้เช่นเดียวกับที่เราทำในโปรแกรม C และสำหรับเธรดที่ทำงานบน GPU ควรประกาศฟังก์ชันตัวช่วยเป็น__device__
.
ดังนั้นฟังก์ชันอุปกรณ์จึงถูกเรียกใช้จากเธรดของเคอร์เนล - หนึ่งอินสแตนซ์สำหรับหนึ่งเธรด ในขณะที่ฟังก์ชันส่วนกลางถูกเรียกใช้จากเธรด CPU
__global__
คือคีย์เวิร์ด CUDA C (ตัวระบุการประกาศ) ซึ่งระบุว่าฟังก์ชัน
ฟังก์ชั่นส่วนกลาง (kernels) ที่เปิดใช้โดยรหัสโฮสต์โดยใช้<<< no_of_blocks , no_of threads_per_block>>>
. แต่ละเธรดดำเนินการเคอร์เนลโดยใช้เธรด id เฉพาะ
อย่างไรก็ตาม__device__
ไม่สามารถเรียกใช้ฟังก์ชันจากรหัสโฮสต์ได้หากคุณจำเป็นต้องใช้ทั้งสอง__host__
__device__
อย่าง
Global Function สามารถเรียกได้จากโฮสต์เท่านั้นและไม่มีประเภทการส่งคืนในขณะที่ Device Function สามารถเรียกได้จากฟังก์ชันเคอร์เนลของฟังก์ชัน Device อื่น ๆ เท่านั้นจึงไม่จำเป็นต้องมีการตั้งค่าเคอร์เนล
__global__
ฟังก์ชั่นนี้ยังสามารถเรียกใช้จากอุปกรณ์โดยใช้ CUDA หมายเคอร์เนล (<<< >>> ... ) ถ้าคุณกำลังใช้ขนานแบบไดนามิก - ที่ต้อง CUDA 5.0 และความสามารถในการประมวลผล 3.5 หรือสูงกว่า