gcl_memcpy自动检测指针类型

时间:2015-09-11 17:01:04

标签: opencl

我在OS X上运行了一个简单的内核,它返回一个int。基本要点是:

cl_int d;
cl_int* dptr = &d;

void* dev_d = gcl_malloc(sizeof(cl_int),NULL,CL_MEM_WRITE_ONLY);

// ... stuff to setup dispatch queue

dispatch_sync(queue, ^{

    // ... running the kernel stuff

    gcl_memcpy((void*)&d, dev_d, sizeof(cl_int));   // this gives d==0
    gcl_memcpy((void*)dptr, dev_d, sizeof(cl_int)); // this gives correct d
});

问题是,& d和dptr有什么区别?我一直认为它们基本上是可以互换的,但gcl_memcpy似乎正在做出区分。有任何想法吗?我显然可以使用dptr解决方案,但我仍然很好奇发生了什么。

1 个答案:

答案 0 :(得分:0)

我认为这与具体的gcl_memcpy调用无关。我认为这与你的GCD电话有关。

当您调用dispatch_sync时,您的块将获取您在其中使用的变量的副本。事实上,在类似的情况下,我收到了编译器关于在块中使用& d的警告,因为它可能是一个常见的错误。

因此,在main函数中,在Address1处有一个变量d,其值为0,而在Address2处的变量dptr的值为Address1。在您的调度块中,在Address3处有一个变量d,其值为0,而在Address4处的变量dptr的值为Address1。因此,当您在调度块中写入& d时,您将把值放在Address3中,您将不会在调度块之外看到它。当您在调度块中写入dptr时,您将把值放在Address1中,这正是您所期望的。

或者换句话说,你对dispatch_queue的调用就像调用一个定义的函数一样 void myfunction(cl_int d,cl_int * dptr)。

如果您对我的回答持怀疑态度,我建议您使用简单的分配而不是gcl_malloc调用来尝试此操作。