Тестирование комбинаций нескольких массивов с помощью Cuda
У меня есть приведенный ниже код, написанный на php, и я читал о Cuda, чтобы использовать вычислительную мощность GPU моего старого Geforce 8800 Ultra. Как преобразовать этот тест вложенных комбинаций в код параллельной обработки 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);
}
}
}
}
}
}
}
1 answers
Это очень открытый вопрос. Это требует преобразования между языками, а также разработки параллельного алгоритма. Я не буду вдаваться в подробности, но в двух словах:
Способ распараллеливания зависит от размера ваших массивов ($a- $e). Если они достаточно велики, вы можете распараллелить только внешние один или два цикла между потоками в сетке и выполнить внутренние циклы последовательно. Если они не очень большие, вы можете либо сгладить 2-3 внешних петли, либо возможно, реализовать их с использованием 2D или 3D блоков потоков и сеток в CUDA.