如果我有多线程应用程序和我自己的线程来控制CUDA设备并将内核调度到不同的流,我可以在Kepler-2(GK110)之前的设备上实现非常高的GPU使用率,就像Fermi和Kepler-1(GK104)一样
所以我没有看到很好的理由渴望更贵的卡片。
在费米卡上流传我的测试示例和分析:
void ut_concurent_kernels()
{
int i,j;
cudaEvent_t kernelEvent;
cudaStream_t work_stream[14];
for (i = 0; i < 14;i++)
{
cudaStreamCreate( &work_stream[i]);
}
cudaEventCreateWithFlags(&kernelEvent, cudaEventDisableTiming);
for (j = 0; j < 2;j++)
{
for (i = 0; i < 14;i++)
{
if (i == 13)
{
checkCudaErrors(cudaEventRecord(kernelEvent, work_stream[i]));
}
Kernel_Work<<<1,256,0,work_stream[i]>>>(100000);
}
checkCudaErrors(cudaStreamWaitEvent(work_stream[i-1], kernelEvent,0));
}
cudaDeviceSynchronize();
for (i = 0; i < 14;i++)
{
cudaStreamDestroy(work_stream[i]);
}
cudaEventDestroy(kernelEvent);
}
答案 0 :(得分:2)
我相信Hyper-Q最程序员可见的表现形式是一个名为CUDA Multi-Process-Server(MPS)的Linux功能。此时,CUDA MPS(在Hyper-Q之上)的主要用例是使MPI群集计算作业能够在多个MPI等级之间共享GPU,用于在同一节点上执行的MPI等级,如上所述here 。在这种情况下,多个MPI等级通常在独立的CPU 进程(而不是线程)之外运行,而CUDA MPS / Hyper-Q提供了一种方便的共享机制。
如前所述,Hyper-Q是cc3.5设备中提供的硬件功能,但不适用于cc 1.x - 3.0设备。在单个应用程序进程的上下文中,无论是单线程还是多线程,我都知道CUDA MPS(在Hyper-Q之上)没有优势或引人注目的用例,而是自己管理多个并发执行。
关于自己管理多个并发执行,Hyper-Q将(透明地)为程序员提供好处,如@Greg Smith在下面的评论中所述。在cc3.5设备中没有特定的要求可以利用它,从概念上讲,用户将使用相同的整体方法管理并发执行,但在cc3中可能会体验到更高的并发性或实现更高并发性的能力。 5设备,由于Hyper-Q的硬件进步。正如Greg所建议的那样,OP已经证明,在cc3.5之前的设备中仍然可以实现并发性,但这样做的机会可能更为有限,或者可能需要的技术要少于明显的编程技术。要更详细地了解这些问题,请参阅幻灯片15-22 here