I trying to multiplicate matrices this way:
// A[m * k] B[k * n] C[0] C[1]
// | 1 2 | | 1 2 3 4| | 1 2 3 4| | 2 4 6 8|
// | 3 4 | * | 5 6 7 8| = | 12 18 21 24| | 20 24 28 32|
// | 5 6 | | 9 1 2 3| = | 45 5 10 15| | 54 6 12 18|
The problem is I cannot figure out how to make the index for A?
__global__ void HadamardProduct( const float* A, const float* B, float* C, const size_t width, const size_t height, const size_t length )
{
const size_t xIndex = blockIdx.x * blockDim.x + threadIdx.x;
const size_t yIndex = blockIdx.y * blockDim.y + threadIdx.y;
const size_t indexB = yIndex * width + xIndex;
if( (xIndex < width) && (yIndex < height))
{
for( size_t n = 0; n < length; n++ ) // copy B to n-element of C
{
const size_t indexC = width * height * n + indexB;
const size_t indexA = height * n + yIndex;
C[ indexC ] = A[ yIndex ] /* [indexB]*/;
}
}
}
if I comment out A[ yIndex ] I have copies of B in C which is correect, but with A
const size_t length = 2; //length number of rows of matrix op(A) and C
const size_t height = 3; //height number of columns of op(A) and rows of op(B).
const size_t width = 4; //width number of columns of op(A) and rows of op(B).
float A[ length * height ] = { 1, 2, 3, 4, 5, 6 };
float B[ height * width ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3 };
float C[ length * width * height ] = { 0 };
int rst = ::DoHadamardProduct( A, B, C, width, height, length );
I wanna have:
float expected[ _countof(C) ] = { 1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5, 2, 4, 6, 2, 4, 6, 2, 4, 6, 2, 4, 6 };