Я работаю над CUDA, и мне связали проблему для поточной обработки синхронизации. В моем коде мне нужны потоки для выполнения различных частей кода, как:
one thread ->
all thread ->
one thread ->
Это - то, что я хочу. В начальной части кода выполнится только один поток, и затем некоторая часть будет выполняться всеми потоками с другой стороны единственный поток. Также потоки выполняются в цикле. Кто-либо может сказать мне, как сделать это?
Вы можете синхронизировать потоки только в пределах одного блока. Синхронизация между несколькими блоками возможна, но только при очень специфических обстоятельствах. Если вам нужна глобальная синхронизация между всеми потоками, способ сделать это - запустить новое ядро.
Внутри блока вы можете синхронизировать потоки с помощью __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
}
}
Вам необходимо использовать идентификатор потока для управления тем, что выполняется, например
if (thread_ID == 0)
{
// do single thread stuff
}
// do common stuff on all threads
if (thread_ID == 0)
{
// do single thread stuff
}