1

GPU のスレッドに for ループを実装してコードを最適化しようとしています。私は、thrust::transform を使用して 2 つの for ループを排除しようとしています。C++ のコードは次のようになります。

    ka_index = 0;
    for (int i = 0; i < N_gene; i++)
    {
        for (int j = 0; j < n_ka_d[i]; j++ )
        {
            co0 = get_coeff0(ka_vec_d[ka_index]);
            act[i] += (co0*ka_val_d[ka_index]); 
            ka_index++;
        }
        act[i] = pow(act[i],n); 
    }

上記のループで常微分方程式 (ODE) の係数を推定しており、推力を使用してすべてのデータをデバイスに転送しました。遺伝子の数をN_geneで表す場合を考える。最初の for ループは N_gene 回実行する必要があります。2 番目の for ループは、各遺伝子のアクティベーター (遺伝子プール内の他の友好的な遺伝子) の数によって制限されます。各遺伝子には、n_ka ベクトルの要素で表される多数のアクティベーター (存在すると遺伝子 i の濃度が増加する友好的な遺伝子) があります。n_ka[i] の値は、0 から N_gene - 1 まで変化します。ka_val は、各アクティベーター ka のアクティベーションの尺度を表します。ka_vec_d には、遺伝子 i を活性化する遺伝子インデックスがあります。

イテレータを使用してこれらのループを表現しようとしていますが、できません。私は、単一の for ループに Thrust::for_each(thrust::make_zip_iterator(thrust::make_tuple)) を使用することに慣れていますが、counting_iterator または変換イテレーターを使用して 2 つの for ループを実装する方法を考え出すのに苦労しています。これら 2 つの for ループを変換するためのポインタまたはヘルプをいただければ幸いです。御時間ありがとうございます!

4

1 に答える 1

1

これは削減の問題のように見えます。zipthrust::transformイテレータとthrust::reduce_by_key. このソリューションのスケッチは次のとおりです。

// generate indices
std::vector< int > hindices;
for( size_t i=0 ; i<N_gene ; ++i )
    for( size_t j=0 ; j<n_ka_d[i] ; ++j )
     hindices.push_back( i );
thrust::device_vector< int > indices = hindices;

// generate tmp
// trafo1 implements get_coeff0( get< 0 >( t ) ) * get< 1 >( t);
thrust::device_vector< double > tmp( N );
thrust::transform(
    thrust::make_zip_iterator(
        thrust::make_tuple( ka_vec_d.begin() , ka_val_d.begin() ) ) ,
    thrust::make_zip_iterator(
        thrust::make_tuple( ka_vec_d.end() , ka_val_d.end() ) ) ,
    tmp.begin() , trafo1 );

// do the reduction for each ac[i]
thrust::device_vector< int > indices_out( N );
thrust::reduce_by_key( indices.begin() , indices.end() , tmp.begin() ,
    ac.begin() , indices_out.begin() );

// do the pow transformation
thrust::transform( ac.begin() , ac.end() , ac.begin() , pow_trafo );

これを transform_iterators で最適化して、 と の呼び出し回数を減らすこともできthrust::transformますthrust::recuce_by_key

于 2013-04-06T11:38:01.567 に答える