Как заставить разные потоки выполнять разные части в CUDA? - PullRequest
1 голос
/ 06 мая 2010

Я работаю над CUDA, и у меня возникла проблема, связанная с синхронизацией потоков. В моем коде мне нужны потоки для выполнения различных частей кода, например:

one thread -> 
all thread ->
one thread ->

Это то, что я хочу. В начальной части кода будет выполняться только один поток, а затем некоторая часть будет выполняться всеми потоками, затем снова один поток Также потоки выполняются в цикле. Может кто-нибудь сказать мне, как это сделать?

Ответы [ 3 ]

2 голосов
/ 06 мая 2010

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

Внутри блока вы можете синхронизировать потоки, используя __syncthreads(). Например:

__global__ void F(float *A, int N)
{
    int idx = threadIdx.x + blockIdx.x * blockDim.x;

    if (threadIdx.x == 0) // thread 0 of each block does this:
    {
         // Whatever
    }
    __syncthreads();

    if (idx < N) // prevent buffer overruns
    {
        A[idx] = A[idx] * A[idx];  // "real work"
    }

    __syncthreads();

    if (threadIdx.x == 0) // thread 0 of each block does this:
    {
         // Whatever
    }
}
0 голосов
/ 24 августа 2012

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

0 голосов
/ 06 мая 2010

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

if (thread_ID == 0)
{
  // do single thread stuff
}

// do common stuff on all threads

if (thread_ID == 0)
{
  // do single thread stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...