我是cuda驅動程序Api接口的新手,但我認爲CUdeviceptr看起來像一個句柄參數。所以我對CUdeviceptr和npp8u *之間的轉換感到困惑。如何將Npp8u *轉換爲CUdeviceptr
Npp8u * src;
......
unsigned char temp;
temp = src;
CUdeviceptr devPtr;
.......
devPtr = (CUdeviceptr)temp;
我試圖寫出像上面那樣的轉換,是對的!
我是cuda驅動程序Api接口的新手,但我認爲CUdeviceptr看起來像一個句柄參數。所以我對CUdeviceptr和npp8u *之間的轉換感到困惑。如何將Npp8u *轉換爲CUdeviceptr
Npp8u * src;
......
unsigned char temp;
temp = src;
CUdeviceptr devPtr;
.......
devPtr = (CUdeviceptr)temp;
我試圖寫出像上面那樣的轉換,是對的!
通常傳遞給cudaMalloc當你不會做這樣明確的,而是投Npp8u *爲void **:
Npp8u * src;
int length = ...
cudaMalloc((void **)(&src), sizeof(Npp8u) * length);
cuDevicePtr
,事實上,原始指針,而不是一個手柄。您可以看到CUDA驅動程序和驅動程序API的原始架構師討論了這個here(並且在此過程中讓我學校)。所以,如果你有一個現有的「輸入」設備指針,它是安全的,其轉換爲cuDevicePtr
,或者反之亦然,例如:
cuDevicePtr m;
cuMemAlloc(&m, size);
Npp8U* p = (Npp8U*)(m);
// Pass p to NPP library functions...
是合法的,並應工作。
謝謝,它編譯成功了。但是「Npp8U * p =(Npp8U *)(m)」,p是錯誤指針。另一方面,我試過了「Npp * p = *(Npp8u **)&m「,它也順利編譯並且p是錯誤指針。 – user2968731
@ user2968731:然後你做錯了什麼。無法看到一個具體的例子,我不能告訴你什麼。 – talonmies
在轉換爲CUdeviceptr
之前,通過將指針降爲unsigned char
,可以屏蔽除src
的最低有效8位以外的所有數據。
只要寫:
Npp8u *src;
CUdeviceptr devPtr = (CUdeviceptr) (uintptr_t) src;
謝謝,我會試試看。 – user2968731
的問題是關於具體的驅動程序API。 'cudaMalloc'不是驅動程序API調用。 – talonmies
@kunzmi HeyBro!你有什麼想法嗎? – user2968731