问题
我正在尝试创建一个与.net完美集成的CUDA应用程序。设计目标是拥有几个可以从托管代码调用的CUDA函数。数据也应该能够在函数调用之间持久保存在设备上,以便可以将其传递给多个CUDA函数。
重要的是,每个单独的数据片段只能由一个OS线程访问(根据CUDA的要求)
我的策略
我在托管C ++代码中包装了CUDA功能和设备指针。 CUDA设备指针可以包装在用MC ++编写的DevicePointer
类中。如果类跟踪它正在使用哪个线程,则可以强制只有一个线程可以访问CUDA设备指针。
然后我将设计程序,以便只有一个线程会尝试访问任何给定的数据。
我需要帮助的地方
我做了一些研究,并阅读了托管线程和操作系统线程之间的区别。一般来说,两者之间似乎存在多对多的关系。
这意味着即使我只使用一个托管线程,它也可以切换操作系统线程,并且我将无法访问设备指针。
有没有办法强制CLR不在OS线程之间移动托管线程?
答案 0 :(得分:4)
使用BeginThreadAffinity
和EndThreadAffinity
方法:
try
{
Thread.BeginThreadAffinity(); // prevents OS thread switch
// your code
// ...
}
finally
{
Thread.EndThreadAffinity();
}
答案 1 :(得分:0)
我怀疑你需要做什么。
但是Cuda并不关心哪个处理器核心/“OS线程”正在运行代码。只要一次只有一个托管线程可以访问数据,就不会有任何竞争条件。
线程关联API通常仅在某人完全了解从不同核心访问CPU内存定位的性能差异时使用。但是,由于你的持久性数据(我假设)在GPU纹理缓冲区而不是CPU内存中,所以即使这样也无关紧要。