Xcode/OSX中的OpenCL-Can';在内核循环中不赋值零

Xcode/OSX中的OpenCL-Can';在内核循环中不赋值零,xcode,opencl,grand-central-dispatch,Xcode,Opencl,Grand Central Dispatch,我正在OpenCL中开发一个加速组件,使用Xcode4.5.1和GrandCentralDispatch,由 整个内核在GPU上不断出现故障,发出信号SIGABRT。除此之外,我在解释错误方面没有多大进展 但是我对内核的各个方面进行了测试,我发现了一些非常奇怪的事情,包括将某些值分配给循环中数组中的位置 测试场景:给每个线程一个固定范围的数组索引进行初始化 kernel void zero(size_t num_buckets, size_t positions_per_bucket, glob

我正在OpenCL中开发一个加速组件,使用Xcode4.5.1和GrandCentralDispatch,由

整个内核在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;
}
上述发现在两台配置不同的机器上得到了证实。(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");

}
#包括
#包括
#包括“零氯氢”
int main(int argc,const char*argv[]{
调度队列=gcl创建调度队列(CL设备类型GPU,空);
大小\u t数量\u桶=64;
每个桶的大小和位置=4;
cl_int*h_数组=malloc(sizeof(cl_int)*存储桶数*每个存储桶的位置);
cl_int*d_数组=gcl_malloc(sizeof(cl_int)*num_bucket*positions_per_bucket,NULL,仅cl_MEM_WRITE_);
调度同步(队列^{
cl_ndrange range={1,{0},{num_bucket},{0};
零内核(&range,num_bucket,positions_per_bucket,d_数组);
gcl_memcpy(h_数组、d_数组、sizeof(cl_int)*存储桶数*每个存储桶的位置);
});
对于(大小i=0;i
参考OpenCL标准第6节第8段“限制”,要点k(重点):

6.8K。程序中内核函数的参数不能用内置标量类型bool、half、size\u t、ptrdiff\u t、intptr\u t和uintptr\t声明。[……]

事实上,编译器甚至允许您构建内核,这表明它有点坏


所以你可能想解决这个问题。。。但是如果这不能解决它,那么它看起来就像一个编译器错误,简单明了(CLC的,也就是OpenCL编译器,而不是您的主机代码)。这个内核没有理由使用0,-1以外的任何常量。您是否尝试过更新OpenCL驱动程序,在不同的操作系统上试一试如何(尽管我认为这段代码仅适用于OSX)

#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");

}