2

私は以下のコードをphpで記述しており、古いGeforce8800UltraのGPU処理能力を利用するためにCudaを読んでいます。このネストされた組み合わせテストをCuda並列処理コードに変換するにはどうすればよいですか(可能であれば...)?2Dアレイの合計の組み合わせ:$ a、$ b、$ c、$ d、$eはすぐに数兆に達します...

foreach($a as $aVal){
    foreach($b as $bVal){
        foreach($c as $cVal){
            foreach($d as $dVal){
                foreach($e as $eVal){

                    $addSum = $aVal[0]+$bVal[0]+$cVal[0]+$dVal[0]+$eVal[0];
                    $capSum = $aVal[1]+$bVal[1]+$cVal[1]+$dVal[1]+$eVal[1];
                    if($capSum <= CAP_LIMIT){
                        $tempArr = array("a" => $aVal[2],"b" => $aVal[2],"c" => $aVal[2],
                        "d" => $aVal[2],"e" => $aVal[2],"addTotal" => $addSum,"capTotal" => $capSum);

                        array_push($topCombinations, $tempArr);

                        if(count($topCombinations) > 1000){
                           $topCombinations = $ca->arraySortedDescend($topCombinations);
                           array_splice($topCombinations, 900);

                        }
                    }  
                }
            }
        }
    }
}
4

1 に答える 1

1

これは非常に広く開かれた質問です。言語間の変換と並列アルゴリズムの設計が必要です。あまり詳しくは説明しませんが、簡単に言うと次のようになります。

並列化する方法は、配列のサイズ($ a-$ e)によって異なります。それらが十分に大きい場合は、グリッド内のスレッド間で外側の1つまたは2つのループのみを並列化し、内側のループを順番に実行できます。それらがそれほど大きくない場合は、外側のループを2〜3個平坦化するか、CUDAで2Dまたは3Dのスレッドブロックとグリッドを使用して実装することをお勧めします。

于 2012-02-23T05:53:46.580 に答える