2014-05-22 17 views
1

我是cuda驅動程序Api接口的新手,但我認爲CUdeviceptr看起來像一個句柄參數。所以我對CUdeviceptr和npp8u *之間的轉換感到困惑。如何將Npp8u *轉換爲CUdeviceptr

Npp8u * src; 
...... 
unsigned char temp; 
temp = src; 
CUdeviceptr devPtr; 
....... 
devPtr = (CUdeviceptr)temp; 

我試圖寫出像上面那樣的轉換,是對的!

回答

-1

通常傳遞給cudaMalloc當你不會做這樣明確的,而是投Npp8u *爲void **:

Npp8u * src; 
int length = ... 
cudaMalloc((void **)(&src), sizeof(Npp8u) * length); 
+0

的問題是關於具體的驅動程序API。 'cudaMalloc'不是驅動程序API調用。 – talonmies

+0

@kunzmi HeyBro!你有什麼想法嗎? – user2968731

3

cuDevicePtr,事實上,原始指針,而不是一個手柄。您可以看到CUDA驅動程序和驅動程序API的原始架構師討論了這個here(並且在此過程中讓我學校)。所以,如果你有一個現有的「輸入」設備指針,它是安全的,其轉換爲cuDevicePtr,或者反之亦然,例如:

cuDevicePtr m; 
cuMemAlloc(&m, size); 

Npp8U* p = (Npp8U*)(m); 
// Pass p to NPP library functions... 

是合法的,並應工作。

+0

謝謝,它編譯成功了。但是「Npp8U * p =(Npp8U *)(m)」,p是錯誤指針。另一方面,我試過了「Npp * p = *(Npp8u **)&m「,它也順利編譯並且p是錯誤指針。 – user2968731

+1

@ user2968731:然後你做錯了什麼。無法看到一個具體的例子,我不能告訴你什麼。 – talonmies

2

在轉換爲CUdeviceptr之前,通過將指針降爲unsigned char,可以屏蔽除src的最低有效8位以外的所有數據。

只要寫:

Npp8u *src; CUdeviceptr devPtr = (CUdeviceptr) (uintptr_t) src;

+0

謝謝,我會試試看。 – user2968731

相關問題