私はCUDAにこのような何かを実装しようとしています:スラストファンクタ:「打ち上げのために要求された、あまりにも多くのリソース」
各要素
floor
と
z
は、開始時に設定された定数である
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でこれを行うことができ
これを実行しているGPUは何ですか?使用しているCUDAのバージョンは?これはおそらく、推力カーネルの起動が、ファンクタが使用しているレジスタの数だけブロックごとに多すぎるスレッドを要求していることを意味しますが、それは単なる推測です。 – talonmies
いくつの要素が入力されていますか? – Anycorn
talonmiesが要求した情報に加えて、コードをコンパイルするためにどのコマンドラインを使用しましたか? –