CUDA: вызов функции __device__ из ядра

У меня есть ядро, которое вызывает функцию устройство внутри оператора if. Код выглядит следующим образом:

__device__ void SetValues(int *ptr,int id)
{
    if(ptr[threadIdx.x]==id) //question related to here
          ptr[threadIdx.x]++;
}

__global__ void Kernel(int *ptr)
{
    if(threadIdx.x<2)
         SetValues(ptr,threadIdx.x);
}

В потоках ядра 0-1 одновременно вызовите SetValues. Что происходит после этого? Я имею в виду, что теперь есть 2 одновременных вызова SetValues. Выполняется ли каждый вызов функции серийно? Таким образом, они ведут себя как 2 вызова функций ядра?

Ответы

Ответ 1

CUDA фактически включает все функции по умолчанию (хотя Fermi и более новые архитектуры также поддерживают правильный ABI с указателями функций и вызовами реальных функций). Таким образом, ваш примерный код скомпилируется примерно так:

__global__ void Kernel(int *ptr)
{
    if(threadIdx.x<2)
        if(ptr[threadIdx.x]==threadIdx.x)
            ptr[threadIdx.x]++;
}

Выполнение происходит параллельно, как и обычный код. Если вы создаете расы памяти в функции, механизм сериализации не может быть сохранен.