2013-04-23 21 views
0

嘗試使用數據類型cudaPitchedptr中的數組時遇到問題。 我將主函數中的數據傳送到全局函數並打印該值。因爲我將cudaMemset3D中的值設置爲12,所以打印的結果是0.0000。附件是我的代碼。我真的很感激,如果有人能幫助我。如何在cudaPitchedPtr類型數據中使用陣列

#include "cuda_runtime.h" 
#include "device_launch_parameters.h" 
#include "cuPrintf.cu" 
#include "stdio.h" 
__global__ void printtest(double devptr[]) 
{ 

printf("%f\n",devptr[1]); 
} 




int main() 
{ 

int width=191, height=192, depth=192; 
cudaExtent extent= make_cudaExtent(width*sizeof(double),height,depth); 
cudaPitchedPtr Ex; 
cudaMalloc3D(&Ex,extent); 

cudaMemset3D(Ex,12 ,extent); 

printtest<<<1,1>>>((double*) Ex.ptr); 
} 
+0

您已將值設置爲1.22416778342e-250,因此正在打印輸出的結果是完全正確的。 – talonmies 2013-04-23 05:44:15

回答

2

的問題是cudaMemset3D用於每字節在一個範圍內的值設定。請注意,在描述:

值 - 值對指定內存

所以,你在你的分配區域設置每個字節到12(十進制)的每個字節進行設置。然後,你將連續讀取8個字節並嘗試將其作爲雙精度浮點類型進行插入。你會得到不符合你期望的結果。

如果你想看到的東西明智的,那麼你的cudaMalloc3D之後,而不是cudaMemset3D,插入此代碼:

double myval = 1.3579f; //or whatever value you want to see 
    double *hostdata; 
    hostdata = (double *)malloc(width*sizeof(double)* height*depth); 
    if (hostdata == 0) {printf("malloc fail"); return 1;} 
    hostdata[1] = myval; 
    cudaMemcpy3DParms p = {0}; 
    p.srcPtr = make_cudaPitchedPtr(hostdata, width*sizeof(double), width, height); 
    p.dstPtr = Ex; 
    p.extent = extent; 
    p.srcPos = make_cudaPos(0,0,0); 
    p.dstPos = make_cudaPos(0,0,0); 
    p.kind=cudaMemcpyHostToDevice; 
    cudaMemcpy3D(&p); 

我也建議每個API調用和內核啓動代碼中的使用後cuda error checking

您可能也有興趣this問題/回答。

相關問題