Возможно ли что-то подобное в CUDA?

0

Скажем, у меня есть матрица со значениями 0 или 1. Это возможно в CUDA, чтобы сделать что-то вроде этого:

__global__ void kernel(float *matrix, float *count)
{
    int row = blockIdx.y * blockDim.y + threadIdx.y;
    int column = blockIdx.x * blockDim.x + threadIdx.x;

    if (row >= MATRIXSIZE || column >= MATRIXSIZE)
    {
        return;
    }

    if (matrix[MATRIXSIZE * row + column] == 1)
    {
        count[0]++;
    }
}

Поэтому я получаю в конце концов число единиц в матрице. Я знаю, это очень простой пример, но если это возможно, так и другие варианты...

  • 0
    Вы должны знать, что каждый поток будет запускать это ядро, и тогда они будут писать с одинаковым count[0] адресов count[0] , вы можете построить вектор результата, который имеет размер вашей сетки, и каждый поток имеет свое собственное местоположение в этом векторе , так что вы можете сделать любую операцию с ним без вмешательства других потоков. Затем выполните сокращение над ним.
  • 0
    @ user3018144: Как сделать такое сокращение?
Показать ещё 2 комментария
Теги:
counter
cuda

2 ответа

4

Существуют высоко оптимизированные библиотеки для CUDA, которые выполняют эти типы операций, называемые сокращениями. Посмотрите на CUDA Thrust или CUB. В Thrust, вы можете использовать reduce суммировать все значения или count для подсчета количества экземпляров определенного значения.

0

Если вы действительно хотите это сделать. Вы должны использовать атомный add: atomicadd. atomicadd(count[0],1)

Но это может вызвать проблемы с производительностью.

  • 0
    Это должно быть atomicAdd(count, 1) .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню