Как реализовать атомную функцию условного оператора, такую ​​как a> b? C: d? - PullRequest
1 голос
/ 07 мая 2019

Я новичок в программе CUDA, мне нужно реализовать атомарную функцию, которая выглядит следующим образом: atomicMyFunc(int *address, int compare, int val1, int val2), "old" - это значение, расположенное по адресу.

Я пытался это сделать длянесколько дней, но не удалось.Должно быть так:

__device__ int atomicMyFunc(int * address, int compare, int val1, int val2)
{
    if(old>compare?val1:val2) // compare and then store val1 or val2 in the address
    {
        // do something
    }
    return old;
}

1 Ответ

2 голосов
/ 07 мая 2019

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

__device__ int atomicMyFunc(int* address, int compare, int val1, int val2) {
    int old = *address;
    int assumed;

    do {
        assumed = old;
        old = atomicCAS(address, assumed, assumed > compare ? val1: val2);
    }
    while (assumed != old);

    return old;
}

Она в основном использует atomicCAS() в цикле, чтобы сохранить результат операции только тогда, когда она имеетвычислено с использованием того же значения, которое в данный момент хранится по указанному адресу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...