2011-06-16 60 views
3

調用函數test後,打印出dtr1陣列。我期望得到所有元素的100,但我沒有得到它。這是爲什麼?CUDA陣列/表面內存

#include "ImageUtil2D.h" 
#define W 10 
#define H 10 
#define MAX 100000 
#define No_THREADS 10 
surface<void,2> surfD; 

__global__ void test() 
{ 
for(int i=0;i<W;i++) 
    for(int j=0;j<H;j++) 
    { 
     float a=100; 
     surf2Dwrite(a, surfD, i,j, cudaBoundaryModeTrap); 
    } 
} 

int main() 
{ 
int *image = new int[W*H]; 
float *dtr = new float[W*H]; 
ImageUtil2D::InitImg(image, dtr, W, H); 
const size_t sizef = size_t(W*H)*sizeof(float); 

cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc(32, 0, 0, 0, cudaChannelFormatKindFloat); 
cudaArray* cuArrD; 
cudaMallocArray(&cuArrD, &channelDesc, W*H, 0, cudaArraySurfaceLoadStore); 
//cudaMemcpyToArray(cuArrD, 0, 0, dtr, sizef, cudaMemcpyHostToDevice); 
cudaBindSurfaceToArray(surfD, cuArrD); 

test<<<1, 1>>>(); 

float *dtr1=new float[W*H]; 
cudaMemcpyFromArray(&dtr1, cuArrD, 0, 0, sizef, cudaMemcpyDeviceToHost); 
ImageUtil2D::Print(dtr1); 
return 0; 
} 
+1

固定告訴你得到了什麼,而不是 – lurscher 2011-06-16 17:57:17

+0

添加錯誤處理周圍的CUDA API調用和郵政編碼在哪裏以及如何失敗。 – fabrizioM 2011-06-16 20:03:14

回答

4

CUDA C語言編程指南3.2。部分:3.2.4.2.2表面綁定

與紋理存儲器不同,表面存儲器使用字節尋址。這意味着用於通過紋理函數訪問紋理元素的x座標需要乘以元素的字節大小才能通過曲面函數訪問相同的元素。

試試這個:

surf2Dwrite(a, surfD, i * 4, j, cudaBoundaryModeTrap); 

希望這有助於。

建議:閱讀面內存全篇或您例外之前,你會得到讀/寫一致性問題;)

+0

嗨,謝謝你的回覆。但它不起作用.. – user570593 2011-06-17 08:28:58

+0

哦,我的道歉,我幾乎可以肯定。我做了一個快速測試,並且存在一個與cudaMemcpyFromArray(&dtr1,cuArrD,0,0,sizef,cudaMemcpyDeviceToHost)有關的引渡問題; – pQB 2011-06-17 10:07:59

1

額外的問題他自己的答案評論所指出的PQB上

cudaMemcpyFromArray(&dtr1, cuArrD, 0, 0, sizef, cudaMemcpyDeviceToHost); 

可以通過改變上述行來

cudaMemcpyFromArray(dtr1, cuArrD, 0, 0, sizef, cudaMemcpyDeviceToHost);