【问题标题】:OpenACC Manage 2D Data MovementOpenACC 管理 2D 数据移动
【发布时间】:2017-04-13 09:45:34
【问题描述】:

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

这是RBM算法函数:

double RBM::propdown(int *h, int i, double b) {
#pragma acc data region \
copyin(w[0:(n_hidden*i)-1],h[0:n_hidden],b) create(pre_sigmoid_activation)
double pre_sigmoid_activation = 0.0;
#pragma acc parallel loop reduction(+:pre_sigmoid_activation) 
for(int j=0; j<n_hidden; j++) {
pre_sigmoid_activation += W[j][i] * h[j];
}
pre_sigmoid_activation += b;  
return sigmoid(pre_sigmoid_activation);
#pragma acc exit data \
delete ( pre_sigmoid_activation)
}

【问题讨论】:

    标签: c++ parallel-processing openacc


    【解决方案1】:

    无需对数组进行线性化。只需使用多个括号。

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

    我还看到了许多其他问题。

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

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

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

    您有一个不匹配的“退出数据”指令(应该有一个相应的“输入数据”指令)。此外,该指令放置在 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];
      }
    }
    

    【讨论】:

    • 非常感谢我不知道原因,但是当我将并行设置为:#pragma acc 并行循环减少(+:pre_sigmoid_activation)编译器反馈是:“调用 cuMemcpyDtoHAsync 返回错误 700 : Illegal address during kernel execution call to cuMemFreeHost return error 700: Illegal address during kernel execution "
    • 这意味着您正在访问超出范围的数组,或者更有可能存在主机指针。 “W”是类数据成员吗?如果是这样,则存在对类“this”指针的隐藏引用,因此访问“W[j][I]”实际上是“this->W[j][I]”。要解决此问题,请将“this”添加到您的“copyin”子句中,即“copyin(this, W[...”
    • 请注意,如果您需要一些关于将 OpenACC 与 C++ 类以及多维数组一起使用的示例,您可以在 github github.com/rmfarber/ParallelProgrammingWithOpenACC 上获取我为“使用 OpenACC 进行并行编程”的第 5 章编写的示例
    • 拜托,你能看到这个话题吗:stackoverflow.com/questions/40976149/…
    猜你喜欢
    • 2016-10-02
    • 2013-04-27
    • 2016-01-04
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多