Как заставить различные потоки выполнить различные части в CUDA?

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

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

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

1
задан talonmies 20 February 2016 в 14:55
поделиться

2 ответа

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

Внутри блока вы можете синхронизировать потоки с помощью __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
    }
}
2
ответ дан 3 September 2019 в 00:45
поделиться

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

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

// do common stuff on all threads

if (thread_ID == 0)
{
  // do single thread stuff
}
0
ответ дан 3 September 2019 в 00:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: