2014-11-08 99 views
0

我在OpenACC中做了一个非常简单的向量添加内核。我想知道这是否与我使用的编译器有关(与OpenCL一起使用)有问题,因为我遇到问题,似乎将数据从设备复制回主机。所有的结果都是正确的但是结果[0]。例如。下面的代码:OpenACC边界问题

for (i=0; i<VEC_SIZE; i++) { 
    a[i] = i; 
    b[i] = VEC_SIZE-i; 
    result[i]=0; 
    } 
    #pragma acc kernels copyin(a,b) copy(result) 
    for (i=0; i<VEC_SIZE; i++) { 
    result[i] = a[i]+b[i]; 
    } 

    // verify result 
    for (i=0; i<VEC_SIZE; i++) { 
    if ((a[i] + b[i]) != result[i]) { 
     fprintf(stderr, "Incorrect results id %d val: %d \n", i, result[i]); 
    } 
    } 

返回如下:

Incorrect results id 0 val: 0 

这意味着所有的结果,但在索引0是正确的,它好像reuslt索引零时,无法从设备复制了一个。

这是一个编译器/运行时错误还是我错过了我的编码方面的东西?

+0

该代码看起来对我很好。我围绕你在这里展示的内容构建了一个完整的代码和测试用例,并使用PGI 14.9工具对其进行编译,并且它似乎工作正常。例子是[here](http://pastebin.com/jXKGWVAC) – 2014-11-08 16:41:25

+0

太棒了,它看起来非常像我的accULL中的一个bug。非常感谢您的确认。如果你想,你可以发布并答复我可以接受。 – AzaraT 2014-11-08 16:53:32

+0

也许更好,当你发现修复是什么的时候,回来回答这个问题。这对未来的读者会更有用。或者也许别人会来为你排序。你正在使用最新版本的accull?它似乎是0.3,但似乎你也可以从[主分支](https://bitbucket.org/ruyman/accull/)下载,它可能会给你“0.3.1”似乎还有一个[accull支持邮件列表](https://groups.google.com/forum/#!forum/accull)。 – 2014-11-08 17:18:24

回答

0

是的,我也认为这是你的编译器的一个bug,因为你的代码看起来不错,你可以试试PGI编译器,现在我正在使用它,它现在属于NVIDIA。 此外,您可以将您的代码“复制(结果)”更改为“copyout(result)”,以减少内存I/O时间,因为结果的初始值对于设备而言是无用的。