我在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解决方案,但我仍然很好奇发生了什么。
答案 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调用来尝试此操作。