gpt4 book ai didi

c++ - NVIDA 的 CUDA '__syncthreads()' 在传统 C++ 中的等价物是什么。如何专业地同步线程?

转载 作者:行者123 更新时间:2023-11-30 02:51:38 25 4
gpt4 key购买 nike

我的应用程序中有 4 个线程。一个是主线程,另外 3 个是工作线程。我希望这 3 个工作线程中的前 2 个生成数据,第 3 个在生成数据时写入数据。数据生成器线程应该是同步的,它们并行运行(同时开始“for”循环的每次迭代)。如果 CPU 足够快,写入线程应该一直在写入。我不知道如何在 C++ 中专业地同步所有这 3 个线程,所以我编写的代码就像有“__syncthreads()”函数一样,以尽我所能表达我的意思。传统 C++ 中是否有 CUDA C '__syncthreads()' 的等价物?如果不是那么如何以我想要的方式最佳地实现同步? (我不喜欢代码中的那些 while 循环。它们只会不必要地提高 CPU 利用率)

volatile bool write_flag ;

int main(int argc, char **argv)
{
...
write_flag = false ; // nothing to write at the beginning
...
HANDLE *trdHandles = new HANDLE[WORKING_THREADS] ;
int IDs[] = {0, 1} ; // IDs for generator threads

trdHandles[0] = CreateThread(NULL, 0, generator, &IDs[0], 0, NULL) ; // 1st data generator thread
if(trdHandles[0] == NULL)
ExitProcess(0) ;
trdHandles[1] = CreateThread(NULL, 0, generator, &IDs[1], 0, NULL) ; // 2nd data generator thread
if(trdHandles[1] == NULL)
ExitProcess(0) ;

trdHandles[2] = CreateThread(NULL, 0, writer, f_out, 0, NULL) ; // writer thread
if(trdHandles[2] == NULL)
ExitProcess(0) ;
...
}

WINAPI DWORD generator(LPVOID lpParam)
{
int *ID = static_cast<int*>(lpParam) ;
dataGen(*ID) ;
return 0 ;
}

void dataGen(int id)
{
...
for(int aa = 0; aa < cycles; aa++)
{
__syncthreads() ;

... // both threads generate data here in parallel

while(write_flag) // don't generate data too fast. Wait for writes to complete (this flag is initially set to 'false')
;
setBuffers(id, aa) ; // for swapping in/out buffers
if(id == 0) // only one thread needs to set the flag
write_flag = true ;
}
}

WINAPI DWORD writer(LPVOID lpParam)
{
ofstream *f_out = static_cast<ofstream*>(lpParam) ;
while(1)
{
if(write_flag)
{
f_out->write(out_buffer0, chunk_len) ;
f_out->write(out_buffer1, chunk_len) ;
write_flag = false ;
if(!finish)
continue ;
else
return 0 ;
}
}
}

最佳答案

按照 The Little Book Of Semaphores 的第 3.5 节所述寻找屏障模式的实现。 .

正如您所描述的,屏障模式用于同步线程。

关于c++ - NVIDA 的 CUDA '__syncthreads()' 在传统 C++ 中的等价物是什么。如何专业地同步线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19608507/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com