我正在编写一个使用表面(重新采样并写入纹理)以获得性能提升的库:
...
surface<void, 2> my_surf2D; //allows writing to a texture
...
目标平台 GPU 具有计算能力 2.0,我可以使用以下代码编译我的代码:
nvcc -arch=sm_20 ...
它工作得很好。
问题是当我尝试在我的笔记本电脑上开发和调试库时,它有一个具有计算能力 1.1 的 NVIDIA ION GPU(我还希望我的库向后兼容)。我知道这个架构不支持表面,所以我在我的设备代码中使用了 nvcc 宏来为这个旧架构定义一个备用代码路径:
#if (__CUDA_ARCH__ < 200)
#warning using kernel for CUDA ARCH < 2.0
...
temp_array[...] = tex3D(my_tex,X,Y,Z+0.5f);
#else
...
surf2Dwrite( tex3D(my_tex,X,Y,Z+0.5f), my_surf2D, ix*4, iy,cudaBoundaryModeTrap);
#endif
问题是当我这样做时:
nvcc -gencode arch=compute_11,code=sm_11
我收到此错误:
ptxas PTX/myLibrary.ptx, line 1784; fatal : Parsing error near '.surf': syntax error
当我查看 PTX 文件时,可以看到表面声明:
.surf .u32 _ZN16LIB_15my_surf2DE;
如果我尝试在源代码中的表面声明周围放置一个类似的宏:
#ifdef __CUDACC__
#if __CUDA_ARCH__ < 200
#warning skipping surface declaration for nvcc trajectory
#else
surface ...
#endif
#else
#warning keeping surface declaration by default
surface ...
#endif
我收到一条错误消息,指出在将 cuda 表面绑定到数组的主机代码调用中未定义表面变量。我也应该在绑定函数周围添加宏吗?
我不确定这是否可能,或者如果我在某个地方搞砸了,请帮忙。