2015-09-11 81 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調用。