Apakah mungkin untuk mengakses GPU-RAM dari CPU-Cores dengan penunjuk sederhana di CUDA6 baru?

Sekarang, jika saya menggunakan kode ini untuk mencoba akses ke GPU-RAM dari CPU-Cores dengan menggunakan CUDA5.5 di GeForce GTX460SE (CC2.1), maka saya mendapatkan pengecualian "Pelanggaran Akses":

#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;
}

Tapi kita tahu, bahwa ada UVA (Unified Virtual Addressing). Dan ada beberapa yang baru:

Apakah mungkin untuk mengakses memori GPU-RAM dari CPU-Cores dengan menggunakan penunjuk sederhana di CUDA6 baru?


person Alex    schedule 19.11.2013    source sumber


Jawaban (1)


Ya, fitur unified memory baru di CUDA 6 akan memungkinkan, di perangkat Kepler dan seterusnya (jadi tidak di GPU Fermi Anda) untuk berbagi petunjuk antara host dan kode perangkat.

Untuk mencapai hal ini, Anda perlu menggunakan perangkat Kepler (jadi cc 3.0 atau 3.5) dan cudaMallocManaged API yang baru. Hal ini akan didokumentasikan lebih lanjut ketika CUDA 6.0 tersedia secara resmi, namun sementara itu Anda dapat membaca lebih lanjut tentangnya di blog ini, yang menyertakan contoh.

Mekanisme ini tidak secara ajaib menyebabkan hilangnya efek bus PCI Express, jadi sebenarnya yang terjadi adalah dua salinan data dibuat "di belakang layar" dan cudaMemcpy operasi dijadwalkan secara otomatis oleh runtime cuda, sesuai kebutuhan . Ada berbagai masalah implementasi lain yang perlu diperhatikan, untuk saat ini saya sarankan membaca blog.

Perhatikan bahwa Unified Memory (UM) berbeda dari Unified Virtual Addressing (UVA) yang telah tersedia sejak CUDA 4.0 dan didokumentasikan.

person Robert Crovella    schedule 19.11.2013
comment
Terima kasih! Artinya, peluang untuk mengakses dari CPU-Core langsung ke GPU-RAM tetap tidak akan ada. Namun akan dimungkinkan, mengalokasikan memori terkelola, yang secara otomatis pada tingkat halaman akan berpindah dari CPU-RAM ke GPU-RAM dan sebaliknya, tergantung bagaimana driver dianggap kinerjanya lebih optimal. Dan jika memori yang dikelola dipindahkan ke GPU-RAM, dan kemudian CPU-Core mencoba mengaksesnya, maka CPU akan memulai pengontrol DMA untuk mengirim data ke GPU-RAM ini (halaman memori). Apakah itu benar? - person Alex; 19.11.2013
comment
Dari sudut pandang pemrogram, CPU tampaknya dapat mengakses memori GPU secara langsung (jika dialokasikan dengan cudaMallocManaged). Pernyataan Anda yang lain tampaknya benar bagi saya. - person Robert Crovella; 19.11.2013
comment
Yaitu. jika saya menggunakan instruksi SSE untuk mengakses dari CPU-Core ke GPU-RAM, maka data akan dikirim ke PCI-Express BAR (Base Address Registers - sebagai fitur perangkat keras en.wikipedia.org/wiki/Base_Address_Register#Bus_enumeration ), yang dipetakan GPU-RAM, dan yang penting - pengontrol DMA untuk itu tidak akan digunakan (karena pengontrol DMA menambahkan latensi untuk paket kecil), bukan? - person Alex; 19.11.2013
comment
Saya tidak akan menjelaskan secara detail penerapan fitur ini, yang tidak bersifat publik. Namun jika Anda menggunakan pointer yang dialokasikan dengan cudaMallocManaged, dan mematuhi persyaratan lainnya (seperti tidak mengaksesnya saat kernel yang juga mengaksesnya sedang berjalan), maka pointer tersebut akan berfungsi baik kode Anda menggunakan SSE atau tidak. - person Robert Crovella; 19.11.2013
comment
Oke. Saya hanya tertarik pada kinerja yang mempengaruhi, apakah pengontrol DMA berfungsi atau tidak. - person Alex; 19.11.2013