Monte Carlo, olasılığa dayalı bir yöntemdir. Resimde de gördüğünüz gibi kare içerisine gömülmüş bir daire düşünün. Bu kare alanın içinde belli bir sayıda nokta atılır ve bu noktaların ne kadarının daire içerisine düştüğü hesaplanır. Yani bir rastgelelik söz konusudur. Bu hesaplama için de kare ve dairenin alan formülleri kullanılır.
Karenin alanı= 2r * 2r
Dairenin alanı= pi * r * r
Daire içerisine düşme olasılığı= Dairenin alanı/Karenin alanı
= pi * r * r / 2r * 2r = pi / 4
Programı yazmadan önce projenizin openmp özelliğini etkin hale getirmeniz gerekir. Bunun için;
Project –> Properties –> C/C++ –> Language –> OpenMP Support –> Yes şeklinde yapmanız yeterlidir.
Kod kısmına geçecek olursak; “omp.h” kütüphanemizi ekliyoruz öncelikle. Daha sonrasında iterasyon sayısını belirleyeceğiz. İtereasyon sayısı ne kadar çok olursa o kadar iyi sonuç verir. Bu uygulamada örnek olarak 100000000 iterasyon belirledik. Bu şu demek oluyor ki, 100000000 adet nokta atacağız ve attığımız nokta sayısı arttıkça hassasiyet iyileşecek. Chunksize ise bilgisayarımızda bulunan her bir işlemcinin yapması gereken iş miktarı. Yani benim bilgisayarım 2 işlemciye sahipse, her bir işlemci 100’er nokta atacak, bittiğinde tekrardan 100’er nokta atacak demektir. Bu değerleri belirledikten sonra paralel kısma geçiyoruz ve paralel bir for açıyoruz. Burada rastgele noktalar atarak dairenin içerisine düşmesi durumunda sayacımızı “1” artırıyoruz. “reduction(+:sayac)” komutuyla, her bir işlemciden gelen sayaçları tekrar topluyoruz. Programın sonunda ekrana yazdırırken 4 ile çarpıyoruz. Çünkü bizim hesapladığımız, dairenin 4’te 1’i için geçerliydi. OpenMP kodları:
#include <stdio.h>
#include <stdlib.h>
#include <omp.h>#define iterasyon 100000000
#define chunksize 100
int main()
{
int sayac = 0
, i;
int chunk=chunksize;
#pragma omp parallel shared(chunk,sayac) private(i)
{
#pragma omp for schedule(dynamic,chunk) reduction(+:sayac)
for (i = 0; i < iterasyon; i++)
{
double x = (double) rand() / RAND_MAX;
double y = (double) rand() / RAND_MAX;
if (x * x + y * y <= 1)
sayac++;
}
}
printf(“PI = %lf\n”, 4.0 * sayac / iterasyon);
system(“pause”);
}