Bellek Yönetimi ve Niteleyiciler

2 minute read

BELLEK YÖNETİMİ

Bir CUDA uygulamasında CPU ve GPU ayrı bellek alanlarını kullanırlar. Programın çalıştırılması sırasında bu bellek alışverişinin sağlanması için fonksiyonlar geliştirilmiştir. Alttaki şekilde “Host(CPU)” ile “Device (GPU)” arasındaki veri aktarımı görülmektedir.

</a>

1. Hafıza Ayırma Fonksiyonları

` cudaMalloc (void ** pointer, size_t nbytes);`

C dilindeki Malloc ile eşdeğerdir, ancak hafıza GİB üzerinde ayrılır .

cudaMemset (void * pointer, int value, size_t count);

İstenilen değer, istenildiği kadar bellek alanına yerleştirilebilir.

cudaFree (void* pointer);

C dilindeki Free ile eşdeğerdir, ancak burada GİB üzerinden ayrılan hafıza serbest bırakılır.

2. Veri Kopyalama Fonksiyonları

cudaMemcpy( void *dst, void *src, size_t nbytes, enum cudaMemcpyKind_direction);

Burada “dst” ile kopyalanacak verinin hedefi, “src” ile kopyalanacak verinin kaynağı, “nbytes” ile kopyalanacak verinin boyutu ve “cudaMemcpyKind_direction” ile kopyalama yönü belirtilmektedir. “enum” veri tipi ile ifade edilen değişkenler daha önceden belirlenmiş kopyalama yönleridir. Buna göre veri alışverişinin yönü CPU’dan GPU’ya, GPU’dan CPU’ya ya da GPU’nun kendi içerisinde olmaktadır. CPU’dan CPU’ya bir yön bulunmamaktadır çünkü bu durumda uygulama heterojen değil klasik bir CPU uygulaması (seri hesaplama) olmaktadır.

  • cudaMemcpyHostToDevice (CPU->GPU)
  • cudaMemcpyDeviceToHost (GPU->CPU)
  • cudaMemcpyDeviceToDevice(GPU->GPU)

BELLEK ERİŞİM FONKSİYON NİTELEYİCİLERİ

1. “global

Kernel kodu , global ile nitelendirilir. main() içerisinde kernel çağrısı yapılırken kernel fonksiyon adı yazılır ve “«< »>” açılı parantezleri yazılır. Bu yazım şekli CUDA’ya özgüdür. Açılı parantezler arasına yazılan ifadeler sırasıyla blocksPerGrid(her bir grid’teki block sayısı) ve threadsPerBlock(her bir block’taki thread sayısı) bilgilerini götermektedir.Kısacası bir kernel çağrısı:

Kernel_fonksiyon_adı<<<blocksPerGrid,threadsPerBlock>>>(fonk_alacağı_parametreler); şeklindedir.

global ile nitelenmiş fonksiyonunun dönüş tipi void olmalıdır. Bu fonksiyon MİB tarafından çağrılabilir, GİB tarafından çağrılamaz. Başka bir global fonksiyonu tarafından da çağrılamaz. GİB üzerinde işlem yürütmektedir.

global” ile nitelenmiş fonksiyonlar asenkron olarak çalışırlar. Yani aygıt(GPU) üzerinde çalışması bitmeden döner.

2. device

GPU üzerinde çalışırlar ve CPU tarafından çağrılamazlar. Yalnızca GPU tarafından çağrılabilir.

3. host

Nitelediği fonksiyonun sadece CPU tarafından çağrılabildiğini ve sadece CPU üzerinde çalıştırılabildiğini ifade etmektedir. Varsayılan fonksiyon niteleyicisi “host” olarak belirlenmiştir.Yani hiçbir niteleyici yazılmasa bile direkt olarak “host” niteleyicisi olduğu varsayılmaktadır. Bazı durumlarda “device” niteleyicisi ile birlikte kullanımları da vardır. “global” niteleyicisi ile birlikte kullanımı sözkonus değildir.

DEĞİŞKEN NİTELEYİCİLERİ

1. device

GİB üzerinde konumlandırılmış bir değişkeni niteler.Bir uygulamada yaşam süresi bellidir. Global bellek üzerinde yer almaktadır. Tüm thread’ler tarafından yürütülebilir.

2. constant

Seçime bağlı olarak “device” niteleyicisi ile birlikte kullanılabilir. Değişmez bellek üzerinde yer alan, belli bir yaşam süresi olan uygulamalarda yer alan ve tüm thread’ler tarafından erişilebilen değişkenleri tanımlamaya olanak sağlar.

3. shared

Seçime bağlı olarak “device” niteleyicisi ile birlikte kullanılabilir. Paylaşımlı bellek üzerinde bir thread block’unda yer alan, belli bir yaşam süresi olan block içerisinde bulunan ve sadece aynı block üzerinde yer alan thread’lerin erişebildiği değişkenleri nitelemektedir.

Tags:

Updated:

Leave a Comment