【问题标题】:Unexplainable behaviour of c array in OpenCLOpenCL 中 c 数组的无法解释的行为
【发布时间】:2016-11-09 18:01:58
【问题描述】:

我遇到了一个有趣的问题:如果我在函数内部定义一个数组,它可以正常工作,但是如果我在函数外部定义相同的数组并将其作为参数传递,则该数组的行为会有所不同。

void main()
{
     unsigned short arr[8] = {0,1,2,3,4,5,6,7};
     fun([...], arr);
}

void fun([...], unsigned short * arr, [...])
{
        [...]
    unsigned short fun_arr[8] = {0,1,2,3,4,5,6,7};
    for(int i = 0; i < 8; i++)
        if(arr[i] != fun_arr[i])
            printf("Not the same"); 

    //until here it works. the arrays are the same, I get no output, as expected

    //this works just fine aswell
    float f = some_float_array[fun_arr[0]];
    //this works aswell
    unsigned short index_from_arr = arr[0];
    //this doesnt. The program crashes (-9999, which isnt an actual OpenCL error)
    float f = some_float_array[arr[0]];
}

【问题讨论】:

    标签: arrays opencl c99


    【解决方案1】:

    函数的数组参数只是指针。 OpenCL 中的指针总是指向特定的内存空间。不幸的是,有一个默认值,即global,这就是你的内部函数fun 正在寻找的地方。您在 main 中声明并传递给fun() 的数组位于private 地址空间中。出于某种原因,许多(大多数?全部?)实现在这种情况下甚至都不会生成警告,因此您必须时刻警惕这个错误。

    解决方案是使用private 注释您的函数参数。根据个人经验,我建议在 OpenCL 中明确说明 all 指针的地址空间。

    更新:

    另请注意,当您使用指向 unsigned short 的指针时,可能会应用字/字节寻址限制,除非您的实现明确没有这些限制。另见https://www.khronos.org/registry/cl/sdk/1.0/docs/man/xhtml/cl_khr_byte_addressable_store.html

    如果有疑问,请切换到 unsigned int 看看是否可以解决问题。

    【讨论】:

    • 我仍然遇到同样的错误。此外,这也不是原因,因为在 for 循环中访问它并将另一个变量关联到数组中的元素是可行的......
    • 您是否在任何地方初始化arr?无论如何,未初始化的变量都是未定义的行为。 (请更新为说明问题的最小完整示例 - “[...]”没有帮助,因为这可能是您的问题所在,我们必须做出假设。)也很高兴知道:平台和 OpenCL 实现.
    • 我编辑了我的代码。 [...] 指的是不重要的代码。我只是想,我会把它留在那里。 cl_khr_byte_addressable_store 没有改变任何东西,我的内核也在其他地方使用了 short 和 char 类型,它们工作正常。
    • 该代码可能看起来并不重要,但是:如果删除它,问题是否仍然存在?字节寻址限制并不像“不要使用 short 和 char 类型”那么简单——它是关于通过指针和数组进行的字节和短大小存储。所以标量变量不受影响。此外,未定义的行为仍然可以是“它在某些情况下有效”。
    猜你喜欢
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多