Я пытаюсь использовать atomicAdd () для суммирования вектора чисел с плавающей точкой, однако, похоже, что он не выполняет никакого сложения.Я использую GTX 970 GPU с вычислительной способностью> 2.x, что требуется в соответствии со спецификацией cuda для использования atomicAdd () на float.
Я пытался реализовать решение I 'нашел в другом месте, но я получаю тот же результат.Вот код для этой попытки:
kernel void atomicAdd_floats(volatile global float *address, float value)
{
float oldval, newval, readback;
oldval = *address;
newval = oldval + value;
if (oldval == newval)
{
readback = atomic_xchg(address, newval);
}
while (readback != oldval)
{
oldval = readback;
newval = oldval + value;
}
}
Обратите внимание, что аргумент volatile global float * address предоставляется из другого ядра, так что это своего рода вспомогательная функция ядра.Аргумент, который я предоставляю, является просто адресом первого элемента моего выходного вектора, который по существу хранит мои суммы.
Я следую за float atomicAdd (float * address, float val);Подпись, описанная в разделе https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html B.12.1.1.
Вот как выглядит мой код ядра:
kernel void reduce_add(global const float* input, global float* output) {
float result = 24.24f;
float temp = 234.352f;
float atomicAdd(float *result, float temp);
printf(" %f ", result);
}
Результат этой операции всегда 24.24.Также обратите внимание, что это не мой настоящий код, сама функция довольно большая, и значения здесь являются фиктивными значениями для тестирования.
Используя эту операцию, я ожидаю того же результата atomic_add, где адрес, который я предоставляюв качестве первого аргумента добавляет и сохраняет значение второго аргумента в предоставленный адрес.Однако, похоже, он полностью игнорирует его и каждый раз возвращает 24.24f.