2015-09-11 44 views
1

我有一个在OS X上运行的简单内核,它返回一个int值。基本位是:gcl_memcpy指针类型的自动检测

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解决方案,但我仍然很好奇发生了什么。

回答

0

我不认为这与专门的gcl_memcpy调用有关。我认为这与你的GCD电话有关。

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

所以在你的主函数中,你在地址1上有一个变量d,值为0,地址2上有一个变量dptr,值为地址1。在您的调度块中,Address3处的变量d的值为0,地址4处的变量dptr的值为Address1。所以当你在你的调度块中写入&d时,你将地址3中的值放在你的调度块外面。当您在调度块中写入dptr时,您将该值写入Address1,这正是您所期望的。

或者换一种说法,您调用dispatch_queue就像调用一个定义为 void myfunction(cl_int d,cl_int * dptr)的函数。

如果您对我的答案持怀疑态度,我建议您尝试使用简单的赋值而不是gcl_malloc调用。