2012-04-11 11 views
1

私はCUDAにこのような何かを実装しようとしています:スラストファンクタ:「打ち上げのために要求された、あまりにも多くのリソース」

各要素

floorzは、開始時に設定された定数である
p = { p if p >= floor 
     z if p < floor 

用テストの

私はそうのようにそれを実装しようとしてきたが、私はエラー「打ち上げのために要求された、あまりにも多くのリソースを」取得

数子:

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 --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 

とブロックあたりのスレッドの私の最大数は次のとおりです。

`nvcc -c -g -arch sm_11 -Xcompiler -fPIC -Xcompiler -Wall -DTHRUST_DEBUG -I <my_include_dir> -o <my_output> <my_source>` 

マイCUDAのバージョンは4.0です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実装の場合、あなたは1行のコードでArrayFireでこれを行うことができ

+2

これを実行しているGPUは何ですか?使用しているCUDAのバージョンは?これはおそらく、推力カーネルの起動が、ファンクタが使用しているレジスタの数だけブロックごとに多すぎるスレッドを要求していることを意味しますが、それは単なる推測です。 – talonmies

+0

いくつの要素が入力されていますか? – Anycorn

+0

talonmiesが要求した情報に加えて、コードをコンパイルするためにどのコマンドラインを使用しましたか? –

答えて

1

p(p < floor) = z; 

だけでAFとして、あなたの変数を宣言::配列のを。

幸運を祈る!

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

関連する問題