Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CUDA:具有公共(共享)参数的内核并发_Cuda - Fatal编程技术网

CUDA:具有公共(共享)参数的内核并发

CUDA:具有公共(共享)参数的内核并发,cuda,Cuda,我有使用一个公共(共享)参数的内核,但是,每个内核都做独立的事情:它们不重叠。如何使它们重叠 CUDA代码看起来像(k0和k1在专用流str[i]中启动): 这就是arg2的doubleconst*const,希望此提示能够帮助nvcc nvvp显示,k2在str[1]中运行,而在k1已完成在str[0]中运行之后 内核不重叠:这与公共参数(arg2)有关吗?如果是,在这种情况下如何使内核相互重叠 更新 我使用开普勒K20m: 计算能力为3.5 支持内核并发( 我正在开发的上一个版本[我们称之

我有使用一个公共(共享)参数的内核,但是,每个内核都做独立的事情:它们不重叠。如何使它们重叠

CUDA代码看起来像(k0和k1在专用流str[i]中启动):

这就是arg2的doubleconst*const,希望此提示能够帮助nvcc

nvvp显示,k2在str[1]中运行,而在k1已完成在str[0]中运行之后

内核不重叠:这与公共参数(arg2)有关吗?如果是,在这种情况下如何使内核相互重叠

更新 我使用开普勒K20m:

  • 计算能力为3.5
  • 支持内核并发( 我正在开发的上一个版本[我们称之为v0]实现了 不同的策略,其中内核重叠[使用nvvp检查],但 小得多:对于v0,内核似乎太小而无法发挥效率 [内核启动时间>=内核运行时间])
不幸的是,该算法总是访问数据,因此我希望它具有高度的带宽限制(每个线程读取大量数据,通常从多个数组中读取数据,执行一些加法或乘法,然后回写到数组中-避免这种情况的方法不多,甚至以不同的方式编写代码……)。注意:算法中没有“如果”,因此执行发散不是问题


从v0开始,我实现了另一个版本v1以“使内核更大”:现在,关于
const
问题,我有了内核启动时间(根据nvvp为50微秒),如果你的目标是开普勒及以上,你可以更好地通过使用
双*const\uuuuuuuuuuuuuu限制arg2向nvcc表明它是只读的,这将提示使用。

关于
const
问题,如果您的目标是开普勒及以上,您可以通过使用
double*const\uuuuu restrict\uuuuu arg2
更好地向nvcc指示它是只读的,这将提示使用

内核不重叠:这与公共参数(arg2)有关吗

不,这不是因为他们共享一个输入参数

通过使用CUDA流,程序员明确表示k0和k1可以并发执行,因此即使用arg3替换arg5,硬件仍然可以并发执行它们

由于这种情况没有发生:

  • 请记住,只有当第一个内核没有填满GPU时,内核才会同时运行,因此请检查网格大小-如果第一个内核填满了整个GPU,那么在第二个内核完成之前,将没有资源运行第二个内核(第一个内核耗尽,第二个内核启动时,可能会有一个微小的重叠)
  • 你在哪个GPU上运行这个?并发内核要求compute capability 2.0或更高版本,您可以检查要检查的
    concurrentKernels
    设备属性(例如,请参阅
    deviceQuery
    示例)
  • 根据您提供的其他信息(请不要将其他信息作为答案发布,您应该修改您的问题或评论),我们可以得出以下结论:(1)这里就是这种情况。在启动下一个内核之前,工作调度器将调度一个内核的所有块;由于第一个内核需要几毫秒来执行,并且由许多线程块组成,因此第二个内核只会在最后一个块开始完成时开始执行

    占用率是SM管理的扭曲数量的度量,占用率为30%,这意味着其他一些因素限制了可以调度的扭曲数量(例如,寄存器使用率、共享内存使用率)-这并不意味着我们可以运行第二个内核。您可以使用CUDA入住率计算器电子表格进一步调查入住率

    有关并发内核的更多信息,您还可以查看

    内核不重叠:这与公共参数(arg2)有关吗

    不,这不是因为他们共享一个输入参数

    通过使用CUDA流,程序员明确表示k0和k1可以并发执行,因此即使用arg3替换arg5,硬件仍然可以并发执行它们

    由于这种情况没有发生:

  • 请记住,只有当第一个内核没有填满GPU时,内核才会同时运行,因此请检查网格大小-如果第一个内核填满了整个GPU,那么在第二个内核完成之前,将没有资源运行第二个内核(第一个内核耗尽,第二个内核启动时,可能会有一个微小的重叠)
  • 你在哪个GPU上运行这个?并发内核要求compute capability 2.0或更高版本,您可以检查要检查的
    concurrentKernels
    设备属性(例如,请参阅
    deviceQuery
    示例)
  • 根据您提供的其他信息(请不要将其他信息作为答案发布,您应该修改您的问题或评论),我们可以得出以下结论:(1)这里就是这种情况。在启动下一个内核之前,工作调度器将调度一个内核的所有块;由于第一个内核需要几毫秒来执行,并且由许多线程块组成,因此第二个内核只会在最后一个块开始完成时开始执行

    占用率是SM管理的扭曲数量的度量,占用率为30%,这意味着其他一些因素限制了可以调度的扭曲数量(例如,寄存器使用率、共享内存使用率)-这并不意味着我们可以运行第二个内核。您可以使用CUDA入住率计算器电子表格进一步调查入住率


    有关并发内核的更多信息,您还可以查看。

    k0运行多长时间?您的目标是什么计算能力?k0运行多长时间?您的目标是什么计算能力?
    k0<<<..., str[0]>>>(arg1, arg2, arg3);
    k1<<<..., str[1]>>>(arg4, arg2, arg5); // k2 uses also arg2
    
    k0(double const * const arg1, double const * const arg2, double * arg3);
    k1(double const * const arg1, double const * const arg2, double * arg3);