Имеет ли это смысл? Просто добавьте оператор 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 будет работать и в конце сокращения. Возможно, мне придется попробовать это в моем коде ...)