我有一个类似于下面给出的结构的循环:
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 会发生什么?它会给我一个错误还是我只是得到意外的行为?
如果以上任何内容不清楚,请告诉我。我很高兴澄清和讨论想法。
谢谢!