我无法获取浮动纹理。纹理定义如下:
texture<float, 2, cudaReadModeElementType> cornerTexture;
绑定和参数设置为:
cornerTexture.addressMode[0] = cudaAddressModeClamp;
cornerTexture.addressMode[1] = cudaAddressModeClamp;
cornerTexture.filterMode = cudaFilterModePoint;
cornerTexture.normalized = false;
cudaChannelFormatDesc cornerDescription = cudaCreateChannelDesc<float>();
cudaBindTexture2D(0, &cornerTexture, cornerImage->imageData_device, &cornerDescription, cornerImage->width, cornerImage->height, cornerImage->widthStep);
height
和width
是元素数量方面的两个维度的大小。 widthStep
就字节数而言。内核访问如下:
thisValue = tex2D(cornerTexture, thisPixel.x, thisPixel.y);
printf("thisPixel.x: %i thisPixel.y: %i thisValue: %f\n", thisPixel.x, thisPixel.y, thisValue);
thisValue
应始终为非负浮动。 printf()
给了我奇怪的,无用的值,这些值与线性记忆实际存储的值不同。我尝试在两个坐标上用0.5f
来抵消访问权限,但它给了我同样错误的结果。
有什么想法吗?
更新似乎存在隐藏的对齐要求。从我可以推断出,传递给cudaBindTexture
函数的音高需要是32字节的倍数。例如,以下结果不正确
cudaBindTexture2D(0, &debugTexture, deviceFloats, &debugDescription, 10, 32, 40)
获取纹理时,但以下(切换宽度和高度的相同数组)效果很好:
cudaBindTexture2D(0, &debugTexture, deviceFloats, &debugDescription, 32, 10, 128)
我不确定我是否遗漏了某些东西,或者确实存在对球场的限制。
更新2:我已向Nvidia提交了错误报告。有兴趣的人可以在他们的开发者专区查看,但我会在这里发回回复。
答案 0 :(得分:3)
音高肯定存在约束,遗憾的是没有设备属性查询来询问CUDA是什么。
但如果您使用cudaMallocPitch()
分配内存并使用传回的音高,则可以保证其正常工作。
答案 1 :(得分:2)
Nvidia回复错误报告:
“这里的问题是绑定到2D纹理的内存没有正确的对齐限制。纹理内存的基本偏移量和音高都有一定的HW依赖对齐限制。但是,目前在CUDA中API,我们只将基本偏移限制公开为设备属性,而不是音高限制。
音高限制将在未来的CUDA版本中解决。同时,建议应用程序在分配内存时使用cudaMallocPitch()
,以便驱动程序负责满足所有限制。“
答案 2 :(得分:1)
您是否使用cudaGetTextureReference
函数获得了与纹理关联的结构?
从NVIDIA C编程指南3.2版(第32页,最后一段):
将纹理绑定到纹理参考时指定的格式必须与声明纹理参考时指定的参数匹配;否则,纹理提取的结果未定义。