Как изменить код ядра CUDA в OpenCL для умножения матриц с использованием тайлинга?

Bilgin спросил: 14 ноября 2017 в 07:30 в: cuda

Недавно я начал работать с OpenCl, и я пытаюсь изменить свой код CUDA, который выполняет умножение мозаичной матрицы, на OpenCl. Я сделал некоторые изменения, но я не уверен, правильно ли я делаю. Я не знаю, что было бы blockIdx, threadIdx, __syncthreads, Ashare и Bshare в opencl. Я буду более чем счастлив, если кто-нибудь может мне помочь.

Мой код ядра CUDA для умножения плиточных матриц:

#define TILE_WIDTH 16
__global__ void matrixMulKernel(float* A, float* B, float* C, int width) {
 __shared__ float Ashare[TILE_WIDTH][TILE_WIDTH];
 __shared__ float Bshare[TILE_WIDTH][TILE_WIDTH];
 int bx = blockIdx.x, by = blockIdx.y;
 int tx = threadIdx.x, ty = threadIdx.y;
 //calculate the row and column for this element of the matrix
 int row = by * TILE_WIDTH + ty;
 int col = bx * TILE_WIDTH + tx;
 float result = 0;
 //loop over the A and B tiles required to compute the C element
 for (int m = 0; m < width / TILE_WIDTH; m++) {
 //collectively load the A and B tiles into shared memory
 Ashare[ty][tx] = A[(row * width) + (m * TILE_WIDTH) + tx];
 Bshare[ty][tx] = B[(((m * TILE_WIDTH) + ty) * width) + col];
 __syncthreads(); //wait for all the shared memory to be loaded for (int k = 0; k < TILE_WIDTH; k++) {
 result += A[ty][k] * B[k][tx];
 }
 __syncthreads(); 
 }
     C[(row * width) + col] = result;
}

0 ответов