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

标签 .net multithreading cuda

问题

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

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

我的策略

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

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

我需要帮助的地方

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

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

有什么方法可以强制 CLR 不在操作系统线程之间移动托管线程吗?

最佳答案

使用BeginThreadAffinityEndThreadAffinity方法:

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

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

关于.net - 加强托管线程和操作系统线程之间的关系(CUDA 用例),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1979191/

相关文章:

c# - 在 C# 中比较两个 List<MyClass>

c# - ObservableCollection<T> 快速填充但缓慢绑定(bind)可视化

c# - 如何确保异常 "The calling thread cannot access this object because a different thread owns it"?

multithreading - 无法销毁线程中的 THTTPReqResp 组件

c++ - 在C++11中如何表达普通的存储(导出)和加载(导入)屏障(fence)?

c++ - 处理 vector - cudaMemcpyDeviceToHost

eclipse - 在 $PATH 中找不到程序 'nvcc'

cuda - 支持 CUDA 5 的 GPU 上不受支持的 GPU 架构计算_30

c# - List 方法获取另一个列表与重复项的差异(listobject.Expect 方法不起作用)

c# - VB6 到 COM 可调用包装的 .NET - 查找 .NET 库的问题