__syncthreads () тупик - PullRequest
       4

__syncthreads () тупик

2 голосов
/ 25 июня 2011

Будет ли __syncthreads () вызывать мертвую блокировку, если ее выполняют только несколько потоков?

У меня есть такое ядро:

__global__ void Kernel(int N,int *a)
{
    if(threadIdx.x<N)
    {
      for(int i=0;i<N;i++)
       {
        a[threadIdx.x]= //Some calculation using a and i
        __syncthreads()
       }
    }
}

если число потоков в блоке больше N, то некоторые потоки не будут выполнять код. это приведет к тупику?
если да, то как я могу изменить код?

Ответы [ 2 ]

3 голосов
/ 25 июня 2011

Вы должны не использовать __syncthreads() в расходящемся коде. Его поведение в таких обстоятельствах не определено.

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

1 голос
/ 25 июня 2011

Технически ядра не могут тупиковать; они могут только тайм-аут. Но да, то, что вы описываете, реально и может произойти. Эта проблема уже обсуждалась ранее, например: Пример реалистичного тупика в CUDA / OpenCL

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