c++ std::线程和OpenMP GPU卸载

w7t8yxp5  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(169)

我一直在重构一些代码,涉及尝试使用OpenMP将一个较大函数的部分卸载到NVIDIA A100。问题是,我试图卸载的部分是一个较大函数的一部分,该函数在C++中通过std::thread线程化。
具体来说,每个std::线程启动一个函数,并且在该函数中,部分函数通过OpenMP卸载到GPU。OpenMP子句是典型的,例如“#pragma omp target teams distribute parallel for...”
这可能会导致以下运行时错误:〉免费:cuLaunchKernel错误:无效资源句柄
如果我消除了任何并发性(删除任何std::thread-ing)并保持OpenMP卸载,它似乎运行良好。
你知道是什么原因造成的吗?我想我不确定OpenMP GPU卸载的线程安全性。

oxiaedzo

oxiaedzo1#

博客文章CUDA Pro Tip: Always Set the Current Device to Avoid Multithreading Bugs建议总是使用cudaSetDevice()显式设置新产生的CPU线程上的设备id。
在fork之前设置设备只对主线程有效,主线程会产生新的工作线程,所以工作线程会默认使用默认设备,即设备id 0。

相关问题