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]++;
}
Выполнение происходит параллельно, как и обычный код. Если вы создаете расы памяти в функции, механизм сериализации не может быть сохранен.