【问题标题】:thrust functor: "too many resources requested for launch"推力函子:“启动请求的资源过多”
【发布时间】:2012-04-23 13:12:15
【问题描述】:

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

对于每个元素

p = { p if p >= floor
      z if p < floor

其中floorz 是在测试开始时配置的常量。

我试图这样实现它,但我收到错误“启动请求的资源太多”

一个函子:

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”重命名为基本上其他任何东西,它就可以工作!我知道为什么会这样,并且很想听听任何人对此的想法。

【问题讨论】:

  • 您在哪个 GPU 上运行它,您使用的是哪个 CUDA 版本?这可能意味着推力内核启动对于您的仿函数正在使用的寄存器数量而言,每个块请求的线程过多,但这只是猜测。
  • 输入中有多少元素?
  • 除了 talonmies 要求的信息之外,您使用什么命令行来编译代码?
  • 我认为第一条评论最相关,您提供的补充并没有向我们展示您的线程/块启动配置。您是否检查过您机器的每个块的最大线程数?
  • 顺便说一句,我认为从技术上讲你希望你的原型是float operator()(const float&amp; x) const

标签: cuda thrust


【解决方案1】:

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

p(p < floor) = z;

只需将变量声明为 af::array's。

祝你好运!

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

【讨论】:

    猜你喜欢
    • 2014-11-18
    • 2014-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多