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