我正在尝试在 CUDA 中实现这样的东西:
对于每个元素
p = { p if p >= floor
z if p < floor
其中floor
和z
是在测试开始时配置的常量。
我试图像这样实现它,但我收到错误"启动请求的资源太多"
函子:
struct floor_functor : thrust::unary_function <float, float>
{
const float floorLevel, floorVal;
floor_functor(float _floorLevel, float _floorVal) : floorLevel(_floorLevel), floorVal(_floorVal){}
__host__
__device__
float operator()(float& x) const
{
if (x >= floorLevel)
return x;
else
return floorVal;
}
};
由转换使用:
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>`
我的 cuda 版本是 4.0:
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2011 NVIDIA Corporation
Built on Thu_May_12_11:09:45_PDT_2011
Cuda compilation tools, release 4.0, V0.2.1221
我每个块的最大线程数是 1024(由 deviceQuery 报告):
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
更新::
我偶然发现了我的问题的解决方案,但不明白它。 如果我将我的函子从"floor_functor"重命名为基本上其他任何东西,它就可以工作了! 我不知道为什么会这样,我很想听听任何人对此的看法。
为了更容易实现 CUDA,您可以在一行代码中使用 ArrayFire 执行此操作:
p(p < floor) = z;
只需将变量声明为 af::array。
祝你好运!
免责声明:我从事各种CUDA项目,包括ArrayFire。