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 ループを変換するためのポインタまたはヘルプをいただければ幸いです。御時間ありがとうございます!