推力を使用して値の配列の最小値と最小値を減らそうとしていますが、私はスタックしているようです。浮動小数点数の配列を考えると、1回のパスで最小値と最大値を減らすことができますが、推力のreduceメソッドを使用すると、代わりにすべてのテンプレートコンパイルエラーの母親(または少なくともauntie)を取得します。推力減少が等しくない入力/出力タイプで動作しない
私のオリジナルコードには、2つのfloat4配列に分散された値の5つのリストが含まれていますが、私はこの短い例に煮詰めました。
struct ReduceMinMax {
__host__ __device__
float2 operator()(float lhs, float rhs) {
return make_float2(Min(lhs, rhs), Max(lhs, rhs));
}
};
int main(int argc, char *argv[]){
thrust::device_vector<float> hat(4);
hat[0] = 3;
hat[1] = 5;
hat[2] = 6;
hat[3] = 1;
ReduceMinMax binary_op_of_dooooom;
thrust::reduce(hat.begin(), hat.end(), 4.0f, binary_op_of_dooooom);
}
私はそれを2回に減らしても、それはもちろん動作します。私の質問は次のとおりです。推力と方法で1回のパスで最小と最大の両方を減らすことは可能ですか?もしそうでなければ、その削減を達成する最も効率的な方法は何ですか?変換イテレータ私を助けて(そうであれば、減少が続い1つのパスの削減になりますか?)
いくつかの追加情報になります。(CUDA 4.2.7によって供給されるような)私が使用している は 私の実際のコードを1.5スラスト減らすだけではなく、reduce_by_keyを使用しています。 この質問を書いている間にtransform_reduceが見つかりましたが、キーには考慮されません。
バイナリ演算子関数は引数の型とは異なる戻り値の型を持つことができません。とにかく 'thrust :: reduce'を使っているのはなぜですか? 'thrust :: minmax_element'を使用できませんか? – talonmies
@gpu:ArrayFire用のプラグを使用するたびに、AccelerEyesで作業することを明らかにする必要があります。 –
@gpu:質問をした人が複数のGPUに配布する必要があるのか、無料版の要件を超えてしまうような他の機能が必要なのか分からないので、ArrayFireは無料で利用できると誤解しています。次に、価格は2 GPUあたり年間$ 2,500です。 @ RogerDahl Dulyが言及した。 –