Нахождение максимального значения в CUDA

Я пытаюсь написать код в CUDA для поиска максимального значения для данного набора чисел.

Предположим, у вас есть 20 номеров, а ядро ​​работает на 2 блоках по 5 потоков. Теперь предположим, что 10 потоков сравнивают первые 10 значений одновременно, и поток 2 находит максимальное значение, поэтому поток 2 обновляет переменную максимального значения в глобальной памяти. Пока поток 2 обновляется, что будет с оставшимися потоками (1,3-10), которые будут сравниваться с использованием старого значения?

Если я заблокирую глобальную переменную с помощью atomicCAS(), будут ли потоки (1,3-10) сравниваться с использованием старого максимального значения? Как я могу преодолеть эту проблему?

3 ответа

Это чисто проблема сокращения. Вот хорошая презентация NVIDIA для оптимизации сокращения на графических процессорах. Вы можете использовать ту же технику, чтобы найти минимум, максимум или сумму всех элементов.

Я думаю, что вы можете использовать библиотеку Thrust, вам может быть легко использовать для таких задач.

Здесь у вас есть соответствующие документы об этом.

Ссылка на библиотеку Thrust не работает.
Если кому-то будет полезно использовать его в этом случае, вы можете найти документацию здесь:
Тяга, экстремальные сокращения

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

__global__
void find_max(int max_x, int max_y, float *tot, float *x, float *y)
{
    int i = blockIdx.x*blockDim.x + threadIdx.x;
    int j = blockIdx.y*blockDim.y + threadIdx.y;
    if(i < max_x && j<max_y) {
        if(*tot < x[i])
            atomicExch(tot, x[i]);
    }
}

Если вы не пытаетесь написать сокращенное ядро, самый простой способ - это просто использовать CUBLAS.

Другие вопросы по тегам