2

问题

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

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

我的策略

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

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

我需要帮助的地方

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

这意味着即使我只使用单个托管线程,它也可以切换操作系统线程,并且我将失去对设备指针的访问权限。

有什么方法可以强制 CLR 不在 OS 线程之间移动托管线程?

4

2 回答 2

4

使用BeginThreadAffinityEndThreadAffinity方法:

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

    // your code
    // ...
}
finally
{
    Thread.EndThreadAffinity();
}
于 2009-12-30T11:16:01.400 回答
0

我怀疑你需要做任何事情。

IIRC,“操作系统线程切换”意味着操作系统可以将线程从一个处理器内核移动到另一个处理器内核(甚至是多插槽系统中的另一个处理器),而在它所谓的智慧中它认为这会提高性能。

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

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

于 2009-12-30T19:25:28.870 回答