如何在主机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];
}
}
答案 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];
}
}