- 30 May 2023
- 23
- 21
Paralel Hesaplama Uygulaması: CUDA ile GPU Kullanımı
Giriş Paralel hesaplama, günümüzün karmaşık hesaplamalarını hızlandırmak ve verimliliği artırmak için kullanılan önemli bir tekniktir. Geleneksel merkezi işlem birimi (computer chip) yerine grafik işlem birimlerini (GPU) kullanarak, büyük veri setleri üzerinde paralel işlemler gerçekleştirilebilir. Bu makalede, paralel hesaplama uygulamalarının bir örneği olan CUDA (Register Brought together Gadget Design) ile GPU kullanımını ele alacağız. CUDA, NVIDIA tarafından geliştirilen bir paralel hesaplama platformudur ve C++ programlama dilini kullanır.
Paralel Hesaplama Nedir?
Paralel hesaplama, bir problemin işlenmesini hızlandırmak için birden çok işlem biriminin eşzamanlı olarak kullanıldığı bir hesaplama yaklaşımıdır. Geleneksel olarak, bir işlemci tek bir işlemi bir kezde çalıştırırken, paralel hesaplama birden çok işlemci çekirdeğini kullanarak birçok işlemi aynı anda gerçekleştirir. Bu, işlemlerin parçalara bölünüp eşzamanlı olarak yürütülmesini sağlar, böylece hesaplama süresi dramatik bir şekilde azalır.
CUDA Nedir?
CUDA, grafik işlem birimlerini paralel hesaplama için kullanmak için NVIDIA tarafından geliştirilen bir platformdur. CUDA, C++ programlama dilini kullanarak GPU üzerinde yüksek performanslı paralel hesaplamalar yapmayı mümkün kılar. CUDA, kullanıcılara GPU'nun paralel işleme yeteneklerini doğrudan kullanma olanağı sunar ve karmaşık hesaplamaların hızlandırılmasına olanak sağlar.
CUDA ile GPU Kullanımı
CUDA ile GPU kullanımı, C++ programlama dilinde CUDA kütüphanesinin kullanılmasıyla gerçekleştirilir. Işlem yapılacak veri ve işlem mantığı tanımlandıktan sonra, CUDA ile paralel hesaplama sağlanır. Aşağıda basit bir örnek verilmiştir:
C++:
#include <iostream>
#include <cuda.h>
__global__ void square(float* d_out, float* d_in) {
int idx = threadIdx.x;
float f = d_in[idx];
d_out[idx] = f * f;
}
int main() {
const int ARRAY_SIZE = 5;
const int ARRAY_BYTES = ARRAY_SIZE * sizeof(float);
// Host tarafında bellek ayrıştırma
float h_in[ARRAY_SIZE];
float h_out[ARRAY_SIZE];
for (int i = 0; i < ARRAY_SIZE; ++i) {
h_in[i] = float(i);
}
// Device tarafında bellek ayrıştırma
float* d_in;
float* d_out;
cudaMalloc((void**)&d_in, ARRAY_BYTES);
cudaMalloc((void**)&d_out, ARRAY_BYTES);
// Veriyi kopyalama: Host --> Device
cudaMemcpy(d_in, h_in, ARRAY_BYTES, cudaMemcpyHostToDevice);
// CUDA çekirdek fonksiyonunu çağırma
square<<<1, ARRAY_SIZE>>>(d_out, d_in);
// Hesap sonuçlarını kopyalama: Device --> Host
cudaMemcpy(h_out, d_out, ARRAY_BYTES, cudaMemcpyDeviceToHost);
// Sonuçları yazdırma
for (int i = 0; i < ARRAY_SIZE; ++i) {
std::cout << h_out[i] << " ";
}
std::cout << std::endl;
// Bellek serbest bırakma
cudaFree(d_in);
cudaFree(d_out);
return 0;
}
Bu örnekte, square adında bir CUDA çekirdek fonksiyonu tanımlanmıştır. Bu çekirdek fonksiyonu, her bir iş parçacığı (string) için bir giriş değerini alır, bu değerin karesini hesaplar ve sonucu bir çıktı dizisine yazar. Ana programda, giriş verisi oluşturulur ve bellekte yer ayrıştırılır. Veri, ana bellekten GPU belleğine kopyalanır ve CUDA çekirdek fonksiyonu çağrılır. Sonuçlar tekrar GPU belleğinden ana belleğe kopyalanır ve ekrana yazdırılır.
Sonuç
Paralel hesaplama, büyük veri setlerinin hızlı bir şekilde işlenmesini sağlayan güçlü bir yaklaşımdır. CUDA ile GPU kullanımı, C++ programcılarına yüksek performanslı paralel hesaplama yetenekleri sunar. Bu makalede, CUDA ile paralel hesaplama uygulamalarının temellerini ele aldık ve C++ kullanarak basit bir örnek verildi. Paralel hesaplama alanında daha fazla ilerleme sağlamak için CUDA'nın daha karmaşık özelliklerini ve optimizasyon tekniklerini keşfedebilirsiniz.
Umarım bu makale, paralel hesaplama ve CUDA ile ilgilenenlere yol gösterici olur. Daha fazla bilgi edinmek için CUDA belgelerini ve kaynaklarını incelemenizi öneririm.