1

私は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));

ファンクターのメンバーの 1 つを削除し、floorValメンバー変数が 1 つだけのファンクターを使用すると、正常に動作します。

これがなぜなのか、どうすれば修正できるのか誰か知っていますか?

追加情報:

私の配列は 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」から基本的に他の名前に変更すると、機能します! なぜこれが事実なのかはわかりませんが、これについて誰かの考えを聞くことに興味があります.

4

1 に答える 1

1

より簡単な CUDA 実装のために、コード 1 行で ArrayFire を使用してこれを行うことができます。

p(p < floor) = z;

変数を af::array として宣言するだけです。

幸運を!

免責事項: 私は ArrayFire を含むあらゆる種類の CUDA プロジェクトに取り組んでいます。

于 2012-04-18T20:11:26.130 に答える