:::: MENU ::::
Programlama Dilleri

İki sayının ve iki vektörün toplanması – MATLAB(Parallel Computing Toolbox) GPU Hesaplama

MATLAB(Parallel Computing Toolbox) GPU Hesaplama ile örnek olarak iki sayının ve iki vektörün toplanması işlemi nasıl gerçekleştirilir?
1.adımda toplama işlemlerini yapacak olan kernel kodunun .cu dosyası içerisine doğru bir şekilde yazılması ve derlenerek .ptx dosyasının oluşturulması gerekmektedir.
test.cu dosyamız:
__global__ void add1( double * pi, double c )
{
*pi += c;
}
__global__ void add2( double * v1, const double * v2 )
{
int idx = threadIdx.x;
v1[idx] += v2[idx];
}

Matlab dosyamız test.m:
toplama1 = parallel.gpu.CUDAKernel('test.ptx','test.cu','add1');
result1 = feval(toplama1,4,3)
toplama2 = parallel.gpu.CUDAKernel('test.ptx','test.cu','add2');
N = 128;
toplama2.ThreadBlockSize = N;
in1 = ones(N,1,'gpuArray');
in2 = ones(N,1,'gpuArray');
result2 = feval(toplama2,in1,in2);
toplama3 = parallel.gpu.CUDAKernel('test.ptx','test.cu','add2');
N = 32;
toplama3.ThreadBlockSize = N;
rin1 = rand(N,1,'gpuArray');
rin2 = rand(N,1,'gpuArray');
result3 = feval(toplama3,rin1,rin2);

Sonuç:
paralel-toplama


PTX dosyası nasıl oluşturulur?

MATLAB(Parallel Computing Toolbox) GPU Hesaplama yaparken çağıracağımız kernelleri daha önceden derleyip, onlara ait .cu (kaynak kod) ve .ptx (parallel thread execution) dosyalarını ilgili Matlab dosyamızın bulunduğu klasöre koyarak gerekli tanımlamaları yapmamız gerekmektedir.

Kullanmış olduğum sistemde nvcc derleyicisinin ihtiyaç duyduğu cl.exe dosyası “C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin” adresinde olduğundan bunu derleme yaparken yazdığım kod satırına dahil etmem gereklidir. Örneğin test.cu dosyasının derlenmesi için:

nvcc -ptx test.cu -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin"

komutunu dosyaların bulunduğu dizinde çalıştırdığımız zaman .ptx dosyamız başarıyla oluşacaktır.

ptx-compile


wait (GPUDevice) Komutu – MATLAB(Parallel Computing Toolbox) GPU Computing

GPU’daki işlemlerin bitmesini beklerken MATLAB’daki diğer işlemleri bekletir. Verileri gather ile GPU’dan CPU’ya aktardığınız zamanlarda kullanımına gerek yoktur, zira GPU’daki işlem bitmeden gather devreye girmemektedir.

gpu = gpuDevice % gpu değişkenine cihazın ataması yapılır
wait(gpu); % Bekleme işlemi gerçekleştirilir


MATLAB(Parallel Computing Toolbox) GPU Hesaplama Örneği – Monte Carlo Simülasyonu

MATLAB(Parallel Computing Toolbox) GPU Hesaplama Örneği – Monte Carlo Simülasyonu


close all; clear all
N = 1e8;
gpu = gpuDevice
for pass = 1:2
disp(' ')
if (pass==1)
disp('Single precision:')
prec = 'single';
else
disp('Double precision:')
prec = 'double';
end
disp(' ')
disp('GPU')
for M = [1e5 1e6 1e7]
parallel.gpu.rng('default');
tic
e4 = 0;
for m = 1:M:N
n = min(M,N-m+1);
x = gpuArray.randn(1,n, prec);
e4 = e4 + sum(x.^4);
end
e4 = e4 / N;
wait(gpu); % ensure it has completed)
fprintf(' ave = %f, elapsed time = %f \n',e4,toc)
end
disp(' ')
disp('CPU')
for M = [1e4 1e5 1e6 1e7]
rng('default');
tic
e4 = 0;
for m = 1:M:N
n = min(M,N-m+1);
y = randn(1,n, prec);
e4 = e4 + sum(y.^4);
end
e4 = e4 / N;
fprintf(' ave = %f, elapsed time = %f \n',e4,toc)
end
end
disp(' ')
whos

Kaynak: http://people.maths.ox.ac.uk/gilesm/codes/matlab_gpu/mc.m


Sayfalar:1...1819202122232425