es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pregunta sobre la dimensión del indexado de bloques en CUDA.

En el siguiente código cuda tomado del libro “Accelerating MATLAB with GPU computing: a primer with examples”, creo que

int row = blockIdx.x * blockDim.x + threadIdx.x;
if (row < 1 || row > numRows - 1)
    return;

int col = blockIdx.y * blockDim.y + threadIdx.y;
if (col < 1 || col > numCols - 1)
    return;

debería ser en realidad

int row = blockIdx.x * blockDim.x + threadIdx.x;
if (row < 0 || row > numRows - 1)
    return;

int col = blockIdx.y * blockDim.y + threadIdx.y;
if (col < 0 || col > numCols - 1)
    return;

¿Estoy en lo correcto?
El siguiente es el código completo que realiza convolución de imágenes utilizando código cuda llamado desde MATLAB.

#include "conv2Mex.h"

__global__ void conv2MexCuda(float* src,
                             float* dst,
                             int numRows,
                             int numCols,
                             float* mask)
{
    int row = blockIdx.x * blockDim.x + threadIdx.x;
    if (row < 1 || row > numRows - 1)
        return;

    int col = blockIdx.y * blockDim.y + threadIdx.y;
    if (col < 1 || col > numCols - 1)
        return;

    int dstIndex = col * numRows + row;
    dst[dstIndex] = 0;
    int mskIndex = 3 * 3 - 1;
    for (int kc = -1; kc < 2; kc++)
    {
        int srcIndex = (col + kc) * numRows + row;
        for (int kr = -1; kr < 2; kr++)
        {
            dst[dstIndex] += mask[mskIndex--] * src[srcIndex + kr];
        }
    }
}

void conv2Mex(float* src, float* dst, int numRows, int numCols, float* msk)
{
    ...
    conv2MexCuda<<<gridSize, blockSize>>>...
    ...
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Es correcto que cambiar las condiciones de fila y columna de < 1 a < 0 podría ser una modificación válida del código. Esto se debe a que en CUDA, la primera fila y columna de una matriz están indexadas como 0 en lugar de 1. Por lo tanto, cambiar las condiciones a < 0 asegura que la primera fila y columna se incluyan en los cálculos.

Comments are closed.