代码之家  ›  专栏  ›  技术社区  ›  biozinc

加强托管线程和操作系统线程之间的关系(CUDA用例)

  •  2
  • biozinc  · 技术社区  · 15 年前

    问题

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

    我的策略

    我在托管C++代码中包装CUDA功能和设备指针。CUDA设备指针可以封装在 DevicePointer

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

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

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

    2 回复  |  直到 15 年前
        1
  •  4
  •   Thomas Levesque    15 年前

    使用 BeginThreadAffinity EndThreadAffinity

    try
    {
        Thread.BeginThreadAffinity(); // prevents OS thread switch
    
        // your code
        // ...
    }
    finally
    {
        Thread.EndThreadAffinity();
    }
    
        2
  •  0
  •   Die in Sente    15 年前

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

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

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