Cuda 与GK104/GF104 nvidia卡的并发内核相比,GK110的Hyper-Q有什么优势?

Cuda 与GK104/GF104 nvidia卡的并发内核相比,GK110的Hyper-Q有什么优势?,cuda,Cuda,如果我有多线程应用程序和我自己的线程来控制CUDA设备并将内核调度到不同的流,那么在开普勒-2(GK110)家族之前的设备上,如费米和开普勒-1(GK104),我也可以实现非常高的GPU使用率 所以我看不出有什么理由渴望更昂贵的卡 在费米卡上流动我的测试示例和分析: void ut_concurent_kernels() { int i,j; cudaEvent_t kernelEvent; cudaStream_t work_stream[14]; for (i =

如果我有多线程应用程序和我自己的线程来控制CUDA设备并将内核调度到不同的流,那么在开普勒-2(GK110)家族之前的设备上,如费米和开普勒-1(GK104),我也可以实现非常高的GPU使用率

所以我看不出有什么理由渴望更昂贵的卡

在费米卡上流动我的测试示例和分析:

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);
} 
void ut\u concurent\u内核()
{
int i,j;
cudaEvent_t kernelEvent;
cudaStream_t work_stream[14];
对于(i=0;i<14;i++)
{
cudaStreamCreate(&work_-stream[i]);
}
cudaEventCreateWithFlags(&kernelEvent,cudaeventdisableting);
对于(j=0;j<2;j++)
{
对于(i=0;i<14;i++)
{
如果(i==13)
{
检查CUDAERRORS(cudaEventRecord(内核事件、工作流[i]);
}
核心工作(100000);
}
检查CUDAErrors(cudaStreamWaitEvent(工作流[i-1],内核事件,0));
}
cudaDeviceSynchronize();
对于(i=0;i<14;i++)
{
cudaStreamDestroy(工作流程[i]);
}
cudaEventDestroy(kernelEvent);
} 

我认为Hyper-Q最明显的表现形式是一个名为CUDA多进程服务器(MPS)的linux功能。CUDA MPS(位于Hyper-Q之上)目前的主要使用情形是,对于在同一节点上执行的MPI列组,使MPI群集计算作业能够在多个MPI列组之间共享GPU,如前所述。在这种情况下,多个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。单个应用程序中的Hyper-Q最多允许32个独立的命令流发送到设备。这不同于以前的CC2.*和3.0设备,它们只有一个到设备的通信通道。CC2.0-3.0设备可以并发执行内核,但由于通信通道的原因,很可能存在虚假依赖和序列化。这通常要求开发人员以不自然的方式提交启动和内存副本,以避免这些错误的依赖关系。