我的代码消耗大量(目前为数百万,最终为数十亿)相对较短(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*/
}
}
}
我采取的没有奏效的方法是:
- 1+ 线程填充 ArrayBlockingQueue,我的主循环消耗和填充数组(装箱/拆箱在这里是杀手)
- 在执行数学的非依赖部分时使用 Callable 生成向量(产生未来)(似乎间接的开销超过了我获得的任何并行性增益)
- 使用 2 个 ArrayBlockingQueue,每个由一个线程填充,一个用于短数组,一个用于长数组(仍然大约是直接单线程情况的两倍)。
我并不是在寻找针对我的特定问题的“解决方案”,而是如何处理并行生成大量小型独立原语并从单个线程中使用它们的一般情况。