CUDA数组 纹理

想请教一个问题,麻烦解答一下!非常感谢!

我之前用的一维float3类型数组表示的三维的float3类型数组写的程序没有问题

后来使用纹理绑定了3D的CUDA数组写的程序始终在运算一直没有停

不知道使用这个纹理和程序不正常有关系没!
我仿照使用的下面的代码

#define my_point float4
texture<my_point, 3, cudaReadModeElementType> tex; // 3D texture ElementType
global void d_render(my_point *d_output)
{

((d_output+threadIdx.zblockDim.xblockDim.y+threadIdx.yblockDim.x+threadIdx.x)).x = tex3D(tex, threadIdx.x, threadIdx.y, threadIdx.z).x; // read from 3D texture
((d_output+threadIdx.zblockDim.xblockDim.y+threadIdx.yblockDim.x+threadIdx.x)).y = tex3D(tex, threadIdx.x, threadIdx.y, threadIdx.z).y;
if(tex3D(tex, threadIdx.x, threadIdx.y, threadIdx.z).z < 9)
((d_output+threadIdx.zblockDim.xblockDim.y+threadIdx.yblockDim.x+threadIdx.x)).z = 8;
else
((d_output+threadIdx.zblockDim.xblockDim.y+threadIdx.yblockDim.x+threadIdx.x)).z = tex3D(tex, threadIdx.x, threadIdx.y, threadIdx.z).z;
}

int main( )
{
my_point h_volume = (my_point )malloc(sizeof(my_point)357);
memset(h_volume, 0, sizeof(my_point)35
7);
for (int i=0;i<7;++i)
for (int j=0;j<5;++j)
for (int k=0;k<3;++k)
{
((h_volume+k+j3+i35)).x=(float)(k+j3+i35+1);
(
(h_volume+k+j3+i35)).y=(float)(k+j3+i35+1);
((h_volume+k+j3+i35)).z=(float)(k+j3+i35+1);
(
(h_volume+k+j3+i35)).w=(float)(k+j3+i35+1);
}

for (int i=0;i<7;++i)
{
for (int j=0;j<5;++j)
{
for (int k=0;k<3;++k)
{
printf(“%f “, ((h_volume+k+j3+i35)).z);
}
printf(”\n”);
}
printf(“\n\n”);
}
cudaArray *d_volumeArray;
// create 3D array
cudaChannelFormatDesc channelDesc = cudaCreateChannelDesc<my_point>();
const cudaExtent volumeSize = make_cudaExtent(3, 5, 7);
cutilSafeCall( cudaMalloc3DArray(&d_volumeArray, &channelDesc, volumeSize) );

// copy data to 3D array
cudaMemcpy3DParms copyParams = {0};
copyParams.srcPtr = make_cudaPitchedPtr((void*)h_volume, volumeSize.width*sizeof(my_point), volumeSize.width, volumeSize.height);
copyParams.dstArray = d_volumeArray;
copyParams.extent = volumeSize;
copyParams.kind = cudaMemcpyHostToDevice;
cutilSafeCall( cudaMemcpy3D(&copyParams) );

// set texture parameters
tex.normalized = false; // access with normalized texture coordinates
tex.filterMode = cudaFilterModePoint; // linear interpolation
tex.channelDesc = channelDesc;
//tex.addressMode[0] = cudaAddressModeWrap; // wrap texture coordinates
//tex.addressMode[1] = cudaAddressModeWrap;
//tex.addressMode[2] = cudaAddressModeWrap;

// bind array to 3D texture
if (cudaBindTextureToArray(tex, d_volumeArray, channelDesc) != (unsigned int)CUDA_SUCCESS )
{
printf(“could not bind texture!”);
return;
}

my_point d_output;
cudaMalloc((void **)&d_output,sizeof(my_point)35
7);
cudaMemset(d_output, 0, sizeof(my_point)35*7);

dim3 gridSize(1,1,1);
dim3 blockSize(3, 5, 7);
d_render<<<gridSize, blockSize>>>(d_output);

my_point h_output = (my_point )malloc(sizeof(my_point)357);
memset(h_output, 2, sizeof(my_point)35
7);
cudaMemcpy(h_output, d_output, sizeof(my_point)357, cudaMemcpyDeviceToHost);
for (int i=0;i<7;++i)
{
for (int j=0;j<5;++j)
{
for (int k=0;k<3;++k)
{
printf("%f ", (
(h_output+k+j3+i3*5)).z);
}
printf(“\n”);
}
printf(“\n\n”);
}
system(“pause”);
}

楼主除了您说要用float3(实际您不能用float3), 而您用的是float4外,以及里面您涉及到的但没有定义的东西都假设您正确定义了。例如cutil*开头的东东外。

您的代码没有看出任何问题!!

我不认为此代码会导致“始终不返回”。

但是楼主您已经给出了它的确会“始终不返回”,同时我表明除了float3实际不能用,以及您用的是float4之外,没有找到会导致问题的所在的回复。

所以我极度困惑加上眼力有限。建议其他会员/版主/NV技术支持/总版主给予查找。

十分感谢您的回复,应该是其他地方的问题,我自己在找找了,O(∩_∩)O谢谢!

这个。。我以为楼主认为自己的代码肯定有问题,所以大量高强度的认真观看。。。(至少半碗米饭的能量被无辜消耗了。。呜呜)

那还是建议楼主先确定下问题的可能范围吧。。嘟嘟。。

是这样的 ,我贴出来的代码是没问题的,我的另外的代码是仿照贴出来的代码的用法使用的,另外的代码有问题,不好意思,我回过头发现自己表达有误,让人产生误解了,我帖子里有个地方也说错了,那个我使用的数据类型是float4,和贴出来的代码开头宏定义的是一样的。

估计还是自己代码其他因素的错误,我如果找到原因了,会回来告知的,再次谢谢您的回复!

您客气了。虽然您贴出了的是无问题的代码。以及虽然浪费了一点小小的阅读排查能量。

但是这足以做一个严肃紧张的论坛工作的活泼调剂了。也谢谢您!