多个 GPU 的时间循环

计算科学 并行计算 显卡
2021-12-10 10:04:21

我有一个类似于下面给出的结构的循环:

DO WHILE (t < tend)
  t = t + dt
  DO j = 1,dim

    var2 = 0
    CALL func_a(param1,var2)
    CALL MPI_COMM_RANK(comm(j),rank,ierr)
    CALL func_b(param1, var2,rank)

    var2 = var2 + 0.5d0*var3(j)
    CALL func_c(var3,param1)
    var2 = var2 - 0.5d0*var3

    CALL func_d(var2,params)
    DO ii = 1,dim
        CALL func_e(var2,param)
        CALL func_f(var2,param)
        CALL func_g(var1,var2,comm(j),t)
        var1 = var2   
    END DO
  END DO
END DO

本节是我要移植到 GPU 的时间循环。所有功能都足够并行,可以单独移植到 GPU。

在时间循环开始之前,所有名为 var1、var2、var3 的变量都在 GPU 内存中复制到 GPU 内存(devvar1、devvar2、devvar3)。如果我执行以下操作:

DO WHILE (t < tend)
  t = t + dt
  DO j = 1,dim

    devvar2 = 0
    CALL cu_func_a<<<block,grid>>>(param1,devvar2)
    CALL cu_func_b<<<block,grid>>>(param1, devvar2)

    devvar2 = devvar2 + 0.5d0*devvar3(j)
    CALL cu_func_c<<<block,grid>>>(devvar3,param1)
    devvar2 = devvar2 - 0.5d0*devvar3

    CALL cu_func_d<<<block,grid>>>(devvar2,params)
    DO ii = 1,dim
        CALL cu_func_e<<<block,grid>>>(devvar2,param)
        CALL cu_func_f<<<block,grid>>>(devvar2,param)
        CALL cu_func_g<<<block,grid>>>(devvar1,devvar2,t)
        devvar1 = devvar2   
    END DO
  END DO
END DO

它会从 GPU 内存复制到 GPU 内存(在同一个 GPU 中)本身吗?或者是否有一些意想不到的行为。

我可以创建另一个内核(特别是用于乘法、加法和复制向量)并在内核中启动它(cu_func_a、cu_func_b、...),这样就不需要在外部进行复制。

另外我还有一个问题。我正在使用多个 K20x GPU,它们有大约 6 GB 的全局内存。当我在时间循环之前从 CPU 复制到 GPU 时,如果我复制的总内存超过 6 GB 会发生什么?它会给我一个错误还是我只是得到意外的行为?

如果以上任何内容不清楚,请告诉我。我很高兴澄清和讨论想法。

谢谢!

1个回答

我划分不同问题的答案。(我回答一些)

我可以创建另一个内核(特别是用于乘法、加法和复制向量)并在内核中启动它(cu_func_a、cu_func_b、...),这样就不需要在外部进行复制。

是的,您可以,这是一个称为动态并行性的功能。它是在 CUDA 5 中引入的。在这些链接中,第 1部分和第2 部分有解释如何使用示例。

它会从 GPU 内存复制到 GPU 内存(在同一个 GPU 中)本身吗?

我不确定我是否理解,如果您询问 id 是否可以修改/复制 GPU 内存中的向量,是的,您可以。例如,使用Thrust,您可以在设备向量中复制(使用“=”)设备向量或修改(参见 saxpy 示例)设备向量。

注意:对于特定参数,cuda 有不同的库,为了获得最佳性能,使用它们很重要(参见例如listcups

更新

当我在时间循环之前从 CPU 复制到 GPU 时,如果我复制的总内存超过 6 GB 会发生什么?

这取决于 GPU。来自 CUDA 8文档,第J.1.3 节。GPU Memory Oversubscription,使用统一内存:

  • GPU < 6.x 引用:“不能分配比 GPU 内存的物理大小更多的托管内存”
  • GPU > 6.x 引用:“换句话说,它们可以分配、访问和共享大于系统总物理容量的数组,从而实现非常大的数据集的核外处理。cudaMallocManaged 不会耗尽内存,因为只要有足够的系统内存可用于分配。”