强制管理线程和OS线程之间的关系(CUDA用例)

时间:2009-12-30 09:09:45

标签: .net multithreading cuda

问题

我正在尝试创建一个与.net完美集成的CUDA应用程序。设计目标是拥有几个可以从托管代码调用的CUDA函数。数据也应该能够在函数调用之间持久保存在设备上,以便可以将其传递给多个CUDA函数。

重要的是,每个单独的数据片段只能由一个OS线程访问(根据CUDA的要求)

我的策略

我在托管C ++代码中包装了CUDA功能和设备指针。 CUDA设备指针可以包装在用MC ++编写的DevicePointer类中。如果类跟踪它正在使用哪个线程,则可以强制只有一个线程可以访问CUDA设备指针。

然后我将设计程序,以便只有一个线程会尝试访问任何给定的数据。

我需要帮助的地方

我做了一些研究,并阅读了托管线程和操作系统线程之间的区别。一般来说,两者之间似乎存在多对多的关系。

这意味着即使我只使用一个托管线程,它也可以切换操作系统线程,并且我将无法访问设备指针。

有没有办法强制CLR不在OS线程之间移动托管线程?

2 个答案:

答案 0 :(得分:4)

使用BeginThreadAffinityEndThreadAffinity方法:

try
{
    Thread.BeginThreadAffinity(); // prevents OS thread switch

    // your code
    // ...
}
finally
{
    Thread.EndThreadAffinity();
}

答案 1 :(得分:0)

我怀疑你需要做什么。

IIRC,“操作系统线程切换”意味着操作系统可以将线程从一个处理器核心移动到另一个处理器核心(或者甚至是多插槽系统中的另一个处理器),当它认为这样可以提高性能时。 / p>

但是Cuda并不关心哪个处理器核心/“OS线程”正在运行代码。只要一次只有一个托管线程可以访问数据,就不会有任何竞争条件。

线程关联API通常仅在某人完全了解从不同核心访问CPU内存定位的性能差异时使用。但是,由于你的持久性数据(我假设)在GPU纹理缓冲区而不是CPU内存中,所以即使这样也无关紧要。