atomicAdd не выполняет сложение с плавающей точкой - PullRequest
0 голосов
/ 23 марта 2019

Я пытаюсь использовать 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.

...