Может ли CUDA сделать Argmax? - PullRequest
0 голосов
/ 19 апреля 2011

Вопрос говорит сам за себя;

Предполагается, что каждый поток делает что-то вроде

value=blockDim.x*blockIdx.x+threadIdx.x;
result=f(value);

где f - функция устройства, достаточно просто найти максимальный результат, добавив вызов atomicMax (), но как узнать, какое значение было?

1 Ответ

1 голос
/ 19 апреля 2011

Имеет ли это смысл? Просто добавьте оператор if, сравнивающий максимальный результат с результатом потока. Если оно совпадает, сохраните значение потока.

value=blockDim.x*blockIdx.x+threadIdx.x;
result=f(value);
atomicMax(max,result);

if result==*max:
    max_value = value;

Или, возможно, вам нужно указать поведение, если несколько потоков имеют максимальный результат ... например, взять самый низкий поток:

value=blockDim.x*blockIdx.x+threadIdx.x;
result=f(value);
atomicMax(max,result);

if result==*max:
    atomicMin(max_value,value);

Тем не менее, если вы находите максимальный результат в каждом потоке, вы захотите использовать сокращение вместо atomicMax. Если я правильно понимаю, функция atomicMax в основном будет выполняться последовательно, тогда как сокращение будет в основном параллельно. Когда вы используете сокращение, вы можете вручную отслеживать значение вместе с результатом - это то, что я делаю. (Хотя, возможно, описанный выше подход if будет работать и в конце сокращения. Возможно, мне придется попробовать это в моем коде ...)

...