Cuda 推力函子;启动所需资源过多”;

Cuda 推力函子;启动所需资源过多”;,cuda,thrust,Cuda,Thrust,我试图在CUDA中实现类似的功能: 对于每个元素 p = { p if p >= floor z if p < floor 由变换使用: thrust::transform(input->begin(), input->end(), output.begin(), floor_functor(floorLevel, floorVal)); 如果我删除了我的函子的一个成员,比如说floorVal,并且只使用一个成员变量的函子,它就可以正常工作 有人知道为什么

我试图在CUDA中实现类似的功能:

对于每个元素

p = { p if p >= floor
      z if p < floor
由变换使用:

thrust::transform(input->begin(), input->end(), output.begin(), floor_functor(floorLevel, floorVal));
如果我删除了我的函子的一个成员,比如说
floorVal
,并且只使用一个成员变量的函子,它就可以正常工作

有人知道为什么会这样吗?我该如何解决

其他信息:

我的数组长度为786432个元素

我的GPU是GeForce GTX590

我正在用命令建造:

`nvcc -c -g -arch sm_11 -Xcompiler -fPIC -Xcompiler -Wall -DTHRUST_DEBUG  -I <my_include_dir> -o <my_output> <my_source>`
我的每个块的最大线程数是1024(由deviceQuery报告):

更新::


我偶然发现了一个解决我问题的方法,但我不明白。如果我将我的函子从“floor_函子”重命名为基本上其他任何东西,它会工作!我不知道为什么会出现这种情况,我很想听听任何人对此的想法。

为了更简单地实现CUDA,您可以使用ArrayFire在一行代码中完成此操作:

p(p < floor) = z;
p(p
只需将变量声明为af::array

祝你好运


免责声明:我从事各种CUDA项目,包括ArrayFire。

为了更轻松地实现CUDA,您可以使用ArrayFire在一行代码中完成此操作:

p(p < floor) = z;
p(p
只需将变量声明为af::array

祝你好运


免责声明:我从事各种CUDA项目,包括ArrayFire。

您在哪个GPU上运行此功能,以及您使用的CUDA版本?这可能意味着,对于你的函子正在使用的寄存器数量,推力内核启动请求的每个块线程太多,但这只是一个猜测。输入中有多少元素?除了talonmies请求的信息外,你使用了什么命令行编译代码?我认为第一条注释最相关,您提供的添加内容没有向我们显示您的线程/块启动配置。你检查过你的机器每个块的最大线程数了吗?顺便说一句,我想从技术上来说,你希望你的原型是
float operator()(const float&x)const
。你在什么GPU上运行这个,你在用什么CUDA版本?这可能意味着,对于你的函子正在使用的寄存器数量,推力内核启动请求的每个块线程太多,但这只是一个猜测。输入中有多少元素?除了talonmies请求的信息外,你使用了什么命令行编译代码?我认为第一条注释最相关,您提供的添加内容没有向我们显示您的线程/块启动配置。你检查过你的机器每个块的最大线程数吗?顺便说一句,我认为从技术上来说,你希望你的原型是
float operator()(const float&x)const
Total amount of constant memory:               65536 bytes
  Total amount of shared memory per block:       49152 bytes
  Total number of registers available per block: 32768
  Warp size:                                     32
  Maximum number of threads per block:           1024
  Maximum sizes of each dimension of a block:    1024 x 1024 x 64
  Maximum sizes of each dimension of a grid:     65535 x 65535 x 65535
p(p < floor) = z;