CUDA: вызов функции __device__ из ядра - PullRequest
21 голосов
/ 19 апреля 2011

У меня есть ядро, которое вызывает функцию 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 Ответ

24 голосов
/ 19 апреля 2011

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

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

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

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