【发布时间】:2017-01-05 17:52:48
【问题描述】:
我的问题是关于在主机和设备之间的不同异步队列中传输多个数组的效果。
假设我们有四个数组:
double *a, *b, *c, *d;
而且,每个都分配了N 的大小。
a = (double*) malloc(N * sizeof(double));
b = (double*) malloc(N * sizeof(double));
c = (double*) malloc(N * sizeof(double));
d = (double*) malloc(N * sizeof(double));
现在,我们可以在一个子句中在设备和主机之间传输它们:
#pragma acc enter data copyin(a[0:N], b[0:N], c[0:N], d[0:N]) async
#pragma acc wait
或者,我们可以使用许多异步子句并将它们转移到不同的队列中:
#pragma acc enter data copyin(a[0:N]) async(1)
#pragma acc enter data copyin(b[0:N]) async(2)
#pragma acc enter data copyin(c[0:N]) async(3)
#pragma acc enter data copyin(d[0:N]) async(4)
#pragma acc wait
上述两种方法的结果是相同的。然而,就性能而言,在某些情况下,第二个似乎更好。
我做了一些测量,发现对于copyouting 和更新主机似乎使用more 比一个队列在性能方面优于one。
我们称第一种方法为one,第二种方法为more,下面的方法为more_nonumber(注意async 子句没有编号):
#pragma acc enter data copyin(a[0:N]) async
#pragma acc enter data copyin(b[0:N]) async
#pragma acc enter data copyin(c[0:N]) async
#pragma acc enter data copyin(d[0:N]) async
#pragma acc wait
然后,这里是 10,000 次迭代的测量值(不包括 100 次第一次和 100 次最后一次,导致其间的平均迭代次数为 9,800 次):
one
复制:64.273us
更新设备:60.928us
更新自我:69.502us
复制输出:70.929us
more
复制:65.944us
更新设备:62.271us
更新自我:60.592us
复制输出:59.565us
more_nonumber
复制:66.018us
更新设备:62.735us
更新自我:70.862us
复制输出:72.317us
平均 9800 次运行!
与one 相比,使用more 方法时,copyout (70.929/59.565) 的速度提高了 19%,或者更新自我 (69.502/60.592) 的速度提高了 14%。
我的问题: 这些数字合法吗?我们可以依赖这些数字吗?
为方便起见,我已将我的代码放在github 上。你可以看看。
【问题讨论】:
标签: asynchronous data-transfer openacc