CUDA Programlama Mimarisi

2 minute read

1. Kernel

CUDA’da geliştirilen bir kodun GPU tarafında çalışacak olan kısmına “kernel” adı verilmektedir. GPU, veri kümesinin her bir elemanı için birer kernel kopyası oluşturulur. Bu kernel kopyalarına “thread” adı verilmektedir. Kernel kodu Host tarafından çağrılır ve Device üzerinde yürütülür. Kernel kodu “global” ile nitelendirilir. Kernel, thread dizilimleri(thread arrays) tarafından çalıştırılır.

2. Thread

Thread, CUDA mimarisindeki en küçük programlama parçacığıdır. Block’lar içerisinde 1B’lu, 2B’lu veya 3B’lu olabilirler. Kendi aralarında eş zamanlı olarak aynı kod parçasını çalıştırmaktadırlar. Thread’ler Block’lar içerisinde dizilerek gruplanırlar. Farklı Block’lardaki Thread’ler ortak çalışmazlar.

Her bir thread’in kendine ait Program Sayacı(PC), kaydedicisi(register) ve durum kaydedicisi(State Register) vardır. Her thread’in Block içerisinde kendine ait bir ID(kimlik,indis)’si vardır. Bu indisler; “threadIdx.x”, “threadIdx.y” ve “threadIdx.z” şeklinde ifade edilmektedir.

3. Block

Block yapısı, paralel olarak çalışan thread’lerden oluşmaktadır. Grid içerisinde tektirler. Grid içerisinde 1B’lu, 2B’lu veya 3B’lu olabilirler. Grid’ler içerisinde dizilerek gruplanırlar. Her bir Block’un , Grid içerisinde kendine ait bir indisi vardır. Bu indisler “blockIdx.x”, “blockIdx.y” ve “blockIdx.z” şeklindedir. İçerisinde barındırdığı thread satır ve sütun sayısına göre boyutlanırlar ve bu boyutlar “blockDim.x”, “blockDim.y” , “blockDim.z” terimleri ile ifade edilmektedir. “blockDim” terimi “threadsPerBlock” terimi ile denktir ve her bir block’taki thread anlamına gelmektedir.

</a>

4. Grid

Grid, Block’ların bir araya gelerek oluşturdukları yapılardır. Her bir Kernel çağrısı bir Grid oluşturur. Yani paralel olarak çalıştırılan kod parçası, kernel çağrısı ile Device üzerinde çalıştırılırken her bir kopyası için bir Grid oluşturulmaktadır. Grid’ler 1B’lu veya 2B’lu olabilirler.Hesaplama kapasitesi 2.0 ve yukarısı sürümlerde gridler 3B’lu da olmaktadırlar. Bu boyutlar “gridDim.x” , “gridDim.y” ve “gridDim.z” şeklinde ifade edilmektedir. “gridDim” terimi ile “blocksPerGrid” terimi denktirler. Alttaki şekilde thread hiyerşisi görülmektedir. Her bir Grid Block’lardan, her bir Block ise Thread’lerden oluşmaktadır.

</a>

Aşağıdaki 2x2’lik Block ve 4x3’lük Thread yapısı göz önüne alınırsa:

  • gridDim.x = 3 (block’ların sütun sayısı kadar)
  • gridDim.y = 2 (block’ların satır sayısı kadar)

  • blockDim.x= 4 (thread’lerin sütun sayısı kadar)
  • blockDim.y= 3 (thread’lerin satır sayısı kadar)

verileri elde edilir.

</a>

Referanslar

  1. NVIDIA,(2012) “NVIDIA CUDA C Programming Guide Version 4.2”
  2. AKÇAY, M., ŞEN, B., ORAK, İ.M., ÇELİK,A. (2011), “Paralel Hesaplama ve CUDA”, 6. Uluslar arası İleri Teknolojiler Sempozyumu (İATS’11)
  3. KIRK, D. ve HWU, W.W. (2010) “Programming Massively Parallel Processor”, Morgan Kaufmann Publishers

Tags:

Updated:

Leave a Comment