对于我的CUDA开发,我使用的是具有16个内核的机器,以及1个带有16个SM的GTX 580 GPU。对于我正在做的工作,我计划启动16个主机线程(每个核心1个),每个线程启动1个内核,每个线程包含1个块和1024个线程。我的目标是在16个SM上并行运行16个内核。这可能/可行吗?
我尽可能多地阅读有关独立情境的内容,但似乎没有太多可用的信息。据我了解,每个主机线程都可以拥有自己的GPU上下文。但是,如果我使用独立的上下文,我不确定内核是否会并行运行。
我可以将所有16个主机线程中的所有数据读入一个巨型结构并将其传递给GPU以启动一个内核。但是,复制太多会使应用程序变慢。
答案 0 :(得分:6)
一次只能在GPU上有一个上下文。实现所需的并行性的一种方法是使用CUDA流。您可以在上下文中创建16个流,并按名称将内存和内核启动到流中。您可以在以下网址的快速网络研讨会中阅读更多内容:http://developer.download.nvidia.com/CUDA/training/StreamsAndConcurrencyWebinar.pdf。完整的API参考在CUDA工具包手册中。 CUDA 4.2手册可在http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_Toolkit_Reference_Manual.pdf获得。
答案 1 :(得分:4)
虽然多线程应用程序可以在同一GPU上同时保存多个CUDA上下文,但这些上下文无法同时执行操作。在激活时,每个上下文都只使用GPU,并且必须在另一个上下文(可能包括使用渲染API或显示管理器的操作)之前生成,才能访问GPU。
总而言之,这种策略不能用于任何当前的CUDA版本或硬件。