cudaBindTexture上的CUDA错误

cudaBindTexture上的CUDA错误,cuda,Cuda,我的问题与帖子中描述的完全相同: 我甚至有以下错误: 错误18:无效的纹理引用。“并且也经历过”不会 在Cudamaloc上抛出错误,但仅在cudaBindTexture上抛出错误 不幸的是,海报(安东·罗斯)回答了他自己的问题,对像我这样刚开始使用CUDA的人来说,这有点太神秘了: 答案是在评论中,我使用了一个我的GPU没有的sm 兼容于 “与GPU不兼容”是有道理的,因为NVIDIA CUDA示例浏览器中的示例程序(称为“Fluids(OpenGL版本)”)在我的笔记本电脑上失败,但在我的

我的问题与帖子中描述的完全相同:

我甚至有以下错误:

错误18:无效的纹理引用。“并且也经历过”不会 在Cudamaloc上抛出错误,但仅在cudaBindTexture上抛出错误

不幸的是,海报(安东·罗斯)回答了他自己的问题,对像我这样刚开始使用CUDA的人来说,这有点太神秘了:

答案是在评论中,我使用了一个我的GPU没有的sm 兼容于

“与GPU不兼容”是有道理的,因为NVIDIA CUDA示例浏览器中的示例程序(称为“Fluids(OpenGL版本)”)在我的笔记本电脑上失败,但在我的工作桌面上工作正常。不幸的是,我仍然不知道“评论中”指的是什么,甚至不知道如何检查GPU SM的兼容性

以下是导致问题的代码:

#定义尺寸512
main
中:

setupTexture(变暗,变暗);
bindTexture();
fluidsGL\u kernels.cu
中:

纹理texref;
静态cudaArray*array=NULL;
无效设置纹理(int x,int y)
{
//包裹模式似乎是新的默认模式
texref.filterMode=cudaFilterModeLinear;
cudaChannelFormatDesc desc=cudaCreateChannelDesc();
cudaMallocArray(阵列和描述,y,x);
getLastCudaError(“Cudamaloc失败”);
}
void绑定纹理(void)
{
cudaBindTextureToArray(texref,array);//此函数本身不会抛出错误,但下面的函数会捕获错误18
getLastCudaError(“cudaBindTexture失败”);
}
硬件信息 以下是
deviceQuery
的输出:

Device 0: "GeForce 9800M GS"
  CUDA Driver Version / Runtime Version          5.0 / 5.0
  CUDA Capability Major/Minor version number:    1.1
  Total amount of global memory:                 1024 MBytes (1073741824 bytes)
  ( 8) Multiprocessors x (  8) CUDA Cores/MP:    64 CUDA Cores
  GPU Clock rate:                                1325 MHz (1.32 GHz)
  Memory Clock rate:                             799 Mhz
  Memory Bus Width:                              256-bit
  Max Texture Dimension Size (x,y,z)             1D=(8192), 2D=(65536,32768), 3D
=(2048,2048,2048)
  Max Layered Texture Size (dim) x layers        1D=(8192) x 512, 2D=(8192,8192)
 x 512
  Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       16384 bytes
  Total number of registers available per block: 8192
  Warp size:                                     32
  Maximum number of threads per multiprocessor:  768
  Maximum number of threads per block:           512
  Maximum sizes of each dimension of a block:    512 x 512 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 1
  Maximum memory pitch:                          2147483647 bytes
  Texture alignment:                             256 bytes
  Concurrent copy and kernel execution:          Yes with 1 copy engine(s)
  Run time limit on kernels:                     Yes
  Integrated GPU sharing Host Memory:            No
  Support host page-locked memory mapping:       Yes
  Alignment requirement for Surfaces:            Yes
  Device has ECC support:                        Disabled
  CUDA Device Driver Mode (TCC or WDDM):         WDDM (Windows Display Driver Mo
del)
  Device supports Unified Addressing (UVA):      No
  Device PCI Bus ID / PCI location ID:           8 / 0
  Compute Mode:
     < Default (multiple host threads can use ::cudaSetDevice() with device simu
ltaneously) >

deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 5.0, CUDA Runtime Versi
on = 5.0, NumDevs = 1, Device0 = GeForce 9800M GS
装置0:“GeForce 9800M GS”
CUDA驱动程序版本/运行时版本5.0/5.0
CUDA能力主要/次要版本号:1.1
全局内存总量:1024 MB(1073741824字节)
(8)多处理器x(8)个CUDA核/MP:64个CUDA核
GPU时钟频率:1325MHz(1.32GHz)
内存时钟频率:799 Mhz
内存总线宽度:256位
最大纹理尺寸(x,y,z)1D=(8192),2D=(6553632768),3D
=(2048,2048,2048)
最大分层纹理大小(dim)x层1D=(8192)x 512,2D=(81928192)
x 512
恒定内存总量:65536字节
每个块的共享内存总量:16384字节
每个块可用的寄存器总数:8192
经纱尺寸:32
每个多处理器的最大线程数:768
每个块的最大线程数:512
块的每个维度的最大大小:512 x 512 x 64
网格各尺寸的最大尺寸:65535 x 65535 x 1
最大内存间距:2147483647字节
纹理对齐:256字节
并发复制和内核执行:是,使用1个复制引擎
内核的运行时间限制:是
集成GPU共享主机内存:否
支持主机页锁定内存映射:是
表面对齐要求:是
设备具有ECC支持:已禁用
CUDA设备驱动程序模式(TCC或WDDM):WDDM(Windows显示驱动程序模式)
德尔)
设备支持统一寻址(UVA):否
设备PCI总线ID/PCI位置ID:8/0
计算模式:
<默认值(多个主机线程可以对设备simu使用::cudaSetDevice()
(同时)>
deviceQuery,CUDA驱动程序=CUDART,CUDA驱动程序版本=5.0,CUDA运行时版本
on=5.0,NumDevs=1,设备0=GeForce 9800M GS

我知道我的GPU有点旧,但它仍然可以很好地运行大多数示例。

您需要编译代码以获得合适的体系结构(如您链接的帖子所述)

由于您有CC 1.1设备,请使用以下nvcc编译选项:

-gencode arch=compute_11,code=sm_11
默认的VisualStudio项目或Makefile可能无法针对适当的体系结构进行编译,因此请始终确保它能够编译

对于Visual Studio,请参阅以下答案:


对于Makefile,这取决于。CUDA SDK示例通常有一个可以修改的
GENCODE\u FLAGS
变量。

您有一个CC 1.1 GPU(参见此行
CUDA能力主要/次要版本号
)。主要问题是:您是如何编译代码的?你能粘贴你使用的命令吗?您使用的是
-gencode arch=compute\u 11,code=sm\u 11
?另外,在你的硬件上应该运行良好,因为最低SM版本显然是1.0。它实际上编译得很好(我使用的是Microsoft Visual Studio 2010示例项目,没有修改)。预编译的可执行文件给出了与我在笔记本电脑上编译和调试时相同的错误,但在桌面上运行良好。类似的东西以稍微不同的形式连续出现两次:-gencode=arch=compute\u 20,code=\“sm\u 20,compute\u 20\”-gencode=arch=compute\u 30,code=\“sm\u 30,compute\u 30\”编译过程中不会看到任何错误,只有在执行期间。如果您阅读nvcc的帮助(
nvcc--help
),您将看到
-code
用于指定要为其生成代码的nVidia GPU的名称,
-arch
用于指定必须编译cuda输入文件的nVidia GPU体系结构类的名称。如果未设置适当的体系结构,则在不适当的GPU上运行代码时可能会发生错误。如果你只为
compute/sm\u 20
compute/sm\u 30
编译,你的代码将在你的GPU上失败(这是我的第一条评论)。缩写为:“…\5\u模拟\fluidsGLfromwork>”…\NVIDIA GPU计算工具包\CUDA\v5.0\bin\nvcc.exe”-gencode=arch=compute\u 20,code=“sm\u 20,compute\u 20”-gencode=arch=compute\u 30,code=”sm\u 30\“--使用本地环境--cl版本2010-ccbin”…Visual Studio 10.0\VC\bin“-I”/“-I”../common/inc“-I”/“-I”../common/inc”-