【问题标题】:Enforcing relationship between Managed Thread and OS Thread (CUDA usecase)强制托管线程和操作系统线程之间的关系(CUDA 用例)
【发布时间】:2009-12-30 09:09:44
【问题描述】:

问题

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

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

我的策略

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

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

我需要帮助的地方

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

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

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

【问题讨论】:

    标签: .net multithreading cuda


    【解决方案1】:

    使用BeginThreadAffinityEndThreadAffinity 方法:

    try
    {
        Thread.BeginThreadAffinity(); // prevents OS thread switch
    
        // your code
        // ...
    }
    finally
    {
        Thread.EndThreadAffinity();
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 实际上这很重要,因为 CUDA 库在 OS 线程上使用线程本地存储 (TLS) 来获取上下文。因此,您需要确保托管线程与它最初诞生的操作系统线程保持绑定。
      • 谢谢,德鲁。我不知道!
      猜你喜欢
      • 2020-02-20
      • 2018-03-19
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多