OpenACC管理2D数据移动

时间:2016-11-29 11:48:11

标签: c++ parallel-processing openacc

如何在主机CPU和GPU之间交换2维元素? 我试着用这个2d元素作为w [0:(n_hidden * i)-1],但编译反馈告诉我有一些错误

这是RBM算法功能:

NSMutableArray *valueArray; // Value array count is 100.

NSMutableArray *indexValue;
NSMutableArray *addValueRangeArray;
for (int i = 0; i< [ valueArray count  ]; i ++) {

if (i == 20 && i <= 50 )
{
 [addValueRangeArray addObject:[valueArray objectAtIndex:i]]; 
      [indexValue addObject:i];
}
}

1 个答案:

答案 0 :(得分:2)

无需线性化阵列。只需使用多个括号。

#pragma acc data copyin(W[0:n_hidden][0:N])

我也看到了其他一些问题。

data指令没有“region”子句。您可能会将此与“输入数据”子句或作为OpenACC基础的PGI加速器模型混淆。

不需要在数据子句中加上“b”,因为它实际上并未在计算区域中使用。另外,通过将其放入数据子句中,您可以在设备上创建“b”全局引用。最好不要在数据子句中保留只读标量,以便将值作为参数传递,而不是需要从全局内存中获取它。

再次通过在数据子句中放置标量变量“pre_sigmoid_activation”,您已经创建了一个全局变量。这里,减少的结果将存储在该设备变量中,而不是在主机上自动更新。为此,您需要添加“更新”指令。更好的是,只需将其从data子句中删除,减少的结果将更新为主变量。

你有一个无与伦比的“退出数据”指令(应该有一个相应的“输入数据”指令)。此外,该指令放在return语句之后,因此永远不会执行,因此将数据保留在设备上。

最后,由于C ++区分大小写,请确保OpenACC指令中的变量名称与实际变量名称匹配。即“W”而不是“w”。

以下是我编写循环的方法。请注意,我不知道“W”的第二个维度的大小,所以只使用了“N”。请相应更新。

#pragma acc data copyin(W[0:n_hidden][0:N],h[0:n_hidden])
{
  #pragma acc parallel loop reduction(+:pre_sigmoid_activation)
  for(int j=0; j<n_hidden; j++) {
    pre_sigmoid_activation += W[j][i] * h[j];
  }
}