调用函数test
后,打印dtr1
数组。我希望得到100
所有元素,但我没有得到它。那是为什么?
#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;
}
答案 0 :(得分:4)
CUDA C编程指南3.2。部分:3.2.4.2.2表面结合
与纹理存储器不同,表面存储器使用字节寻址。这意味着用于通过纹理函数访问纹理元素的x坐标需要乘以元素的字节大小,以通过表面函数访问同一元素。
试试这个:
surf2Dwrite(a, surfD, i * 4, j, cudaBoundaryModeTrap);
希望得到这个帮助。
建议:阅读关于Surface Memory的整章,或者在排除之前你会得到读/写一致性问题;)
答案 1 :(得分:1)
pQB在评论中指出了其他问题
cudaMemcpyFromArray(&dtr1, cuArrD, 0, 0, sizef, cudaMemcpyDeviceToHost );
可以通过将上面的行更改为
来修复cudaMemcpyFromArray(dtr1, cuArrD, 0, 0, sizef, cudaMemcpyDeviceToHost );