imam ovdje dvije datoteke gim.py i inverz2.cu u kojima je priikazan generalizirani inverz matrice. Zamolila bih nekoga ako mi može liniju po liniju koda napisati šta se u toj liniji dešava. HVALAA!!!
gim.py
import numpy as np
from numpy import linalg
import pycuda.autoinit
import pycuda.driver as drv
from pycuda.compiler import SourceModule
import time
mod = SourceModule(open("inverz2.cu").read())
A = np.array([[2,1,3],[4,2,7],[3,1,5]], dtype = np.int32)
print 'Matrica:\n', A
print 'Inverz matrice CPU\n'
start_cpu = time.time()
I_CPU = linalg.inv(A)
det = linalg.det(A)
end_cpu = time.time()
print I_CPU
print 'CPU vrijeme: ', (end_cpu-start_cpu)
A_t = np.transpose(A)
print 'Transponirana matrica A:\n', A_t
print 'Determinanta matrice',det
K0 = (A[1,1]*A[2,2]) - (A[1,2]*A[2,1])
K1 = (A[1,0]*A[2,2]) - (A[1,2]*A[2,0])
K2 = (A[1,0]*A[2,1]) - (A[1,1]*A[2,0])
print K0, K1, K2
detInv = 1/det;
print 'GPU Obrada:'
start_gpu = time.time()
inverzGPU = np.empty((3,3), dtype = np.int32)
inverz = mod.get_function("inverz2")
inverz(drv.Out(inverzGPU), drv.In(A), det, K0, K1, K2, detInv, block=(3,3,1), grid=(1,1))
print inverzGPU
end_gpu = time.time()
print 'GPU vrijeme: ', (end_gpu-start_gpu)
inverz2.cu
#include<stdio.h>
__global__ void inverz2(int *rezultat, int *matrica, int K0, int K1, int K2, int det, int detInv)
{
const int idx = threadIdx.y * blockDim.x + threadIdx.x;
if(idx == 0)
{
rezultat[idx] = K0 * detInv;
}
if(idx == 3)
{
rezultat[idx] = -(K1 * detInv);
}
if(idx == 6)
{
rezultat[idx] = K2 * detInv;
}
if(idx == 1)
{
rezultat[idx] = - ((matrica[idx+2]*matrica[idx+7]) - (matrica[idx+5]*matrica[idx+4]));
}
if(idx == 2)
{
rezultat[idx] = (matrica[idx+1]*matrica[idx+5]) - (matrica[idx+4]*matrica[idx+2]);
}
if(idx == 4)
{
rezultat[idx] = (matrica[idx-4]*matrica[idx+4])-(matrica[idx+2]*matrica[idx-2]);
}
if(idx == 5)
{
rezultat[idx] = -((matrica[idx-5]*matrica[idx+2])-(matrica[idx+1]*matrica[idx-4]));
}
if(idx == 7)
{
rezultat[idx] = -((matrica[idx-7]*matrica[idx-2])-(matrica[idx-4]*matrica[idx-5]));
}
if(idx == 8)
{
rezultat[idx] = (matrica[idx-8]*matrica[idx-4])-(matrica[idx-5]*matrica[idx-7]);
}
}