【问题标题】:OpenCL in Xcode/OSX - Can't assign zero in kernel loopXcode/OSX 中的 OpenCL - 无法在内核循环中分配零
【发布时间】:2013-03-27 20:09:47
【问题描述】:

我正在使用 Xcode 4.5.1 和 Grand Central Dispatch 在 OpenCL 中开发一个加速组件,由 this tutorial 指导。

完整的内核在 GPU 上不断失败,发出信号 SIGABRT。除此之外,我无法在解释错误方面取得太大进展。

但是我打破了内核的各个方面进行测试,我发现了一些非常奇怪的事情,涉及将某些值分配给循环内数组中的位置。

测试场景:给每个线程一个固定范围的数组索引来初始化。

kernel void zero(size_t num_buckets, size_t positions_per_bucket, global int* array) {

    size_t bucket_index = get_global_id(0);
    if (bucket_index >= num_buckets) return;

    for (size_t i = 0; i < positions_per_bucket; i++)
        array[bucket_index * positions_per_bucket + i] = 0;
}

上述内核失败。但是,当我分配 1 而不是 0 时,内核成功(并且我的主机代码打印出 1 的数组)。根据对各种整数值的少量测试,我只遇到了 0 和 -1 的问题。

我试图用 1-1、(int) 0 等来超越编译器,但没有成功。不过,将零作为内核参数传入是可行的。

对零的赋值确实在 for 循环的上下文之外起作用:

    array[bucket_index * positions_per_bucket] = 0;

上述发现在两台不同配置的机器上得到证实。 (OSX 10.7 + GeForce,OSX 10.8 + Radeon。)此外,内核在 CL_DEVICE_TYPE_CPU 上运行时没有问题——它只是在 GPU 上。

很明显,发生了一些可笑的事情,而且一定是在我的头上,因为“零”不能被打破。希望这很简单。感谢您的帮助。

主机代码:

#include <stdio.h>
#include <OpenCL/OpenCL.h>
#include "zero.cl.h"

int main(int argc, const char* argv[]) {

    dispatch_queue_t queue = gcl_create_dispatch_queue(CL_DEVICE_TYPE_GPU, NULL);

    size_t num_buckets = 64;
    size_t positions_per_bucket = 4;

    cl_int* h_array = malloc(sizeof(cl_int) * num_buckets * positions_per_bucket);
    cl_int* d_array = gcl_malloc(sizeof(cl_int) * num_buckets * positions_per_bucket, NULL, CL_MEM_WRITE_ONLY);

    dispatch_sync(queue, ^{

        cl_ndrange range = { 1, { 0 }, { num_buckets }, { 0 } };
        zero_kernel(&range, num_buckets, positions_per_bucket, d_array);
        gcl_memcpy(h_array, d_array, sizeof(cl_int) * num_buckets * positions_per_bucket);

    });

    for (size_t i = 0; i < num_buckets * positions_per_bucket; i++)
        printf("%d ", h_array[i]);
    printf("\n");

}

【问题讨论】:

    标签: xcode opencl grand-central-dispatch


    【解决方案1】:

    请参阅 OpenCL 标准,第 6 节,第 8 段“限制”,要点 k(强调我的):

    6.8 千。不能使用内置标量类型 bool、half、size_t、ptrdiff_t、intptr_t 和 uintptr_t 来声明程序中内核函数的参数。 [...]

    您的编译器甚至允许您构建内核这一事实表明它有些损坏。


    所以您可能想要修复它...但如果它不能修复它,那么它看起来像一个编译器错误,简单明了(CLC,即 OpenCL 编译器,而不是您的主机代码)。没有理由这个内核应该使用除 0、-1 以外的任何常量。您是否尝试过更新您的 OpenCL 驱动程序,尝试在不同的操作系统上怎么样(尽管我认为此代码仅适用于 OS X)?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 2022-11-01
      • 2018-07-20
      • 1970-01-01
      • 2015-01-03
      • 1970-01-01
      相关资源
      最近更新 更多