เป็นไปได้ไหมที่จะเข้าถึง GPU-RAM จาก CPU-Cores ด้วยตัวชี้อย่างง่ายใน CUDA6 ใหม่

ตอนนี้ หากฉันใช้โค้ดนี้เพื่อลองเข้าถึง GPU-RAM จาก CPU-Core โดยใช้ CUDA5.5 ใน GeForce GTX460SE (CC2.1) ฉันจะได้รับข้อยกเว้น "การละเมิดการเข้าถึง":

#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include <iostream>

int main()
{
    unsigned char* gpu_ptr = NULL;
    cudaMalloc((void **)&gpu_ptr, 1024*1024);

    *gpu_ptr = 1;

    int q; std::cin >> q;
    return 0;
}

แต่เรารู้ว่ามี UVA (Unified Virtual Addressing) และมีบางอย่างใหม่:

  • 25 ตุลาคม 2556 - 331.17 Beta Linux GPU Driver: โมดูล NVIDIA Unified Kernel Memory ใหม่เป็นโมดูลเคอร์เนลใหม่สำหรับฟีเจอร์ Unified Memory ที่จะเปิดเผยโดย CUDA ของ NVIDIA ที่กำลังจะเปิดตัวเร็วๆ นี้ โมดูลใหม่คือ nvidia-uvm.ko และจะช่วยให้พื้นที่หน่วยความจำแบบรวมระหว่าง GPU และ RAM ของระบบ http://www.phoronix.com/scan.php?page=news_item&px=MTQ5NDc
  • คุณสมบัติที่สำคัญของ CUDA 6 ได้แก่: Unified Memory -- ลดความยุ่งยากในการเขียนโปรแกรมโดยทำให้แอปพลิเคชันสามารถเข้าถึงหน่วยความจำ CPU และ GPU โดยไม่จำเป็นต้องคัดลอกข้อมูลจากที่หนึ่งไปยังอีกที่หนึ่งด้วยตนเอง และทำให้ง่ายต่อการเพิ่มการรองรับการเร่งความเร็ว GPU ในหลากหลาย ภาษาโปรแกรม http://www.techpowerup.com/194505/nvidia-dramaically-simplifies-parallel-programming-with-cuda-6.html

เป็นไปได้ไหมที่จะเข้าถึงหน่วยความจำ GPU-RAM จาก CPU-Cores โดยใช้ตัวชี้อย่างง่ายใน CUDA6 ใหม่


person Alex    schedule 19.11.2013    source แหล่งที่มา


คำตอบ (1)


ใช่ คุณลักษณะ unified memory ใหม่ใน CUDA 6 จะทำให้ บนอุปกรณ์ Kepler และอื่นๆ (ไม่ใช่บน Fermi GPU ของคุณ) สามารถแชร์พอยน์เตอร์ระหว่างโฮสต์และโค้ดของอุปกรณ์ได้

เพื่อให้บรรลุเป้าหมายนี้ คุณจะต้องใช้อุปกรณ์ Kepler (เช่น cc 3.0 หรือ 3.5) และ cudaMallocManaged API ใหม่ ข้อมูลนี้จะมีการบันทึกไว้เพิ่มเติมเมื่อ CUDA 6.0 พร้อมใช้งานอย่างเป็นทางการ แต่ในระหว่างนี้ คุณสามารถอ่านเพิ่มเติมเกี่ยวกับเรื่องนี้ได้ที่ บล็อกนี้ ซึ่งรวมถึงตัวอย่าง

กลไกนี้ไม่ได้ทำให้เอฟเฟกต์ของบัส PCI Express หายไปอย่างน่าอัศจรรย์ ดังนั้นสิ่งที่เกิดขึ้นก็คือสำเนาข้อมูลสองชุดกำลังถูกจัดทำ "เบื้องหลัง" และการดำเนินการ cudaMemcpy ได้รับการกำหนดเวลาโดยอัตโนมัติโดยรันไทม์ cuda ตามความจำเป็น . มีปัญหาในการใช้งานอื่นๆ มากมายที่ต้องทราบ สำหรับตอนนี้ ฉันขอแนะนำให้อ่านบล็อก

โปรดทราบว่า Unified Memory (UM) แตกต่างจาก Unified Virtual Addressing (UVA) ซึ่งมีให้ใช้งานตั้งแต่ CUDA 4.0 และ จัดทำเป็นเอกสาร

person Robert Crovella    schedule 19.11.2013
comment
ขอบคุณ! นั่นคือโอกาสในการเข้าถึงจาก CPU-Core ไปยัง GPU-RAM โดยตรงจะยังคงไม่มีอยู่ แต่จะเป็นไปได้ให้จัดสรรหน่วยความจำที่ได้รับการจัดการซึ่งจะย้ายจาก CPU-RAM ไปเป็น GPU-RAM และย้อนกลับโดยอัตโนมัติที่ระดับเพจขึ้นอยู่กับว่าไดรเวอร์มีประสิทธิภาพสูงสุดอย่างไร และหากหน่วยความจำที่ได้รับการจัดการย้ายไปที่ GPU-RAM แล้ว CPU-Core พยายามเข้าถึงมัน CPU จะเริ่มตัวควบคุม DMA เพื่อส่งข้อมูลไปยัง GPU-RAM นี้ (หน้าหน่วยความจำ) นั่นถูกต้องใช่ไหม? - person Alex; 19.11.2013
comment
จากมุมมองของโปรแกรมเมอร์ CPU ดูเหมือนจะสามารถเข้าถึงหน่วยความจำ GPU ได้โดยตรง (หากได้รับการจัดสรรด้วย cudaMallocManaged) ข้อความที่เหลือของคุณดูเหมือนถูกต้องสำหรับฉัน - person Robert Crovella; 19.11.2013
comment
เช่น. ถ้าฉันใช้คำแนะนำ SSE เพื่อเข้าถึงจาก CPU-Core ไปยัง GPU-RAM ข้อมูลจะถูกส่งไปยัง PCI-Express BAR (Base Address Registers - เป็นคุณลักษณะของฮาร์ดแวร์ en.wikipedia.org/wiki/Base_Address_Register#Bus_enumeration ) ซึ่งแมป GPU-RAM และสิ่งสำคัญ - ตัวควบคุม DMA สำหรับมันจะไม่เป็น ใช้แล้ว (เพราะตัวควบคุม DMA เพิ่มเวลาแฝงสำหรับแพ็กเก็ตขนาดเล็ก) ใช่ไหม - person Alex; 19.11.2013
comment
ฉันจะไม่ลงรายละเอียดการใช้งานฟีเจอร์นี้ซึ่งไม่เปิดเผยต่อสาธารณะ แต่ถ้าคุณใช้พอยน์เตอร์ที่จัดสรรด้วย cudaMallocManaged และปฏิบัติตามข้อกำหนดอื่นๆ (เช่น ไม่เข้าถึงในขณะที่เคอร์เนลที่เข้าถึงพอยน์เตอร์กำลังทำงานอยู่) ก็ควรจะใช้งานได้ไม่ว่าโค้ดของคุณจะใช้ SSE หรือไม่ก็ตาม - person Robert Crovella; 19.11.2013
comment
ตกลง. ฉันสนใจเฉพาะประสิทธิภาพที่ส่งผลกระทบหากตัวควบคุม DMA ทำงานหรือไม่ - person Alex; 19.11.2013