Suppose I want to translate the following C routine into a CUDA kernel.
And, I want to use all the dimensions in the grid to run the kernel.
How can I calculate the indices of the row and column of the matrix?
void OuterProduct(float* A, float* B, float** C, int N)
{
for(int r=0 ; r<N ; r++)
{
for(int c=0 ; c<N ; c++)
{
for(int cc=0 ; cc<N ; cc++)
{
(*C)[r * N + c] += A[r * N + cc] * B[cc * N + c];
}
}
}
}
The following is my understanding:
__global__ void MultiplyMatKernel(I* A, I* B, I* C, int N)
{
int dimx = N;
int dimy = N;
int dimz = N;
int r = blockIdx.x * blockDim.x + threadIdx.x;
int c = blockIdx.y * blockDim.y + threadIdx.y;
int d = blockIdx.z * blockDim.z + threadIdx.z;
if (r < N && c < N && d < N)
{
int loc_c = d * dimx * dimy + c * dimx + r;
for (int cc=0; cc<N; cc++)
{
int loc_a = (cc * dimx * dimy) + (c * dimx) + r;
int loc_b = (d * dimx * dimy) + (cc * dimx) + r;
C[loc_c] += A[loc_a]*B[loc_b];
}
}
}
I this correct? I think not.
Can you give me the correct rationale for calculating loc_a
, loc_b
, and loc_c
?