OpenMP ile bilgisayarımızın işlemcilerinin tamamını kullanarak eş zamanlı olarak hesaplama yapabilmekteyiz. C ile OpenMP kullanmadan, 1’den bizim gireceğimiz N sayısına kadar olan sayıları toplamak istersek, bilgisayarımız tek bir işlemciyi kullanacaktır. Fakat bunu OpenMP ile gerçekleştirecek olursak, her bir işlemciye iş dağıtılır ve işlem, paralel olarak gerçekleştirilir. Örneğimize geçmeden önce, kısaca iki önemli fonksiyondan bahsedelim. “omp_get_thread_num()” fonksiyonu, iş yapacak olan threadin id değerini tutar. “omp_get_num_threads()” fonksiyonumuz ise, bilgisayarımızda bulunan thread sayısını tutar.
#include<stdio.h>
int main ()
{
int nthreads, tid, t_sayisi, ToplamSon=0;
int toplam[2];//2 işlemcim olduğu için 2 elemanlı dizi oluşturdum
int N;
printf(“N?\n”);
scanf(“%d”, &N);//Kaça kadar olan sayıların toplanacağını N değişkenine atadıkfor(int i=0; i<2; i++)
{
toplam[i] = 0;
}
//İşlemin paralel olarak çalıştığı kısmı “#pragma” ile başlatıyoruz. Bu blok içerisinde işlemciler eş zamanlı olarak çalışıyor. Döngü içerisinde olmamasına rağmen ekrana
, kaçıncı threadin hangi sonucu bulduğu 2 kez yazılıyor fark ettiyseniz.
#pragma omp parallel private(tid)
{
//İşlem yapacak threadin id değerini ve thread sayısını değişkenlere atadık
tid = omp_get_thread_num();
t_sayisi=omp_get_num_threads();
//Burada i değeri, tid değerine göre değişmekte ve thread sayısı kadar artış göstermekte. Böylelikle her bir threadin aynı sayıları toplaması önleniyor.
for(int i = tid; i<N+1; i+=t_sayisi)
{
toplam[tid] + = i;
}
printf(“Thread %d , toplam = %d \n”, tid, toplam[tid]);
for(int i = 0; i<2; i++)
{
ToplamSon + =toplam[i];
}
printf(“TOPLAM = %d \n”, ToplamSon);
}
Hocam çok güzel anlatmışsın. Open MP bilmeyen birisi olduğumu varsayarak şu soruya cevap verin lütfen; paralel her işlemci aynı fonksiyonu mu kullanacak? #pragma omp parallel private(tid)
fonksiyonu her işlemci tarafından çağrılacak mı? Bu konuda yazı içerisinde bilgilendirme yok. Sadece bu nedenle bile yazınız eleştirilebilir bir yazı haline gelmiş.
Teşekkürler, düzenledim yazıyı 🙂
Bu program 2 kez yazmadı toplamı. Emin misiniz diye sorsam ayıp olur mu 🙂
Yazıyı yazalı baya olmuş, ama denemeden eklemiyorum yazıları, sizde bir yanlışlık olması lazım 🙂