У меня есть код, который потребляет большое количество (миллионов в настоящее время, в конечном итоге миллиарды )относительно коротких (5 -100 элементов )массивов случайных чисел и делает некоторые не -очень -напряженными математика с ними. Случайные числа, ну, случайные, в идеале я хотел бы генерировать их на нескольких ядрах, поскольку генерация случайных чисел составляет> 50% моего времени выполнения при профилировании. Однако у меня возникли трудности с распределением большого количества небольших задач таким образом, чтобы это было не медленнее, чем однопоточный -подход.
Мой код в настоящее время выглядит примерно так:
for(int i=0;i<1000000;i++){
for(RealVector d:data){
while(!converged){
double[] shortVec = new double[5];
for(int i=0;i<5;i++) shortVec[i]=rng.nextGaussian();
double[] longerVec = new double[50];
for(int i=0;i<50;i++) longerVec[i]=rng.nextGaussian();
/*Do some relatively fast math*/
}
}
}
Подходы, которые я использовал, которые не сработали,:
Я не столько ищу «решения» своей конкретной проблемы, сколько как справиться с общим случаем параллельной генерации больших потоков небольших независимых примитивов и их потребления из одного потока.