Tôi có mã tiêu thụ một số lượng lớn (hàng triệu hiện tại, cuối cùng là hàng tỷ) các mảng ngẫu nhiên tương đối ngắn (5-100 phần tử) và thực hiện một số phép toán không quá vất vả chúng. Các số ngẫu nhiên, tốt, ngẫu nhiên, lý tưởng tôi muốn tạo chúng trên nhiều lõi, vì việc tạo số ngẫu nhiên là> 50% thời gian chạy của tôi trong lược tả. Tuy nhiên, tôi gặp khó khăn trong việc phân phối một số lượng lớn các tác vụ nhỏ theo cách không chậm hơn so với phương pháp đơn luồng.Hiệu suất cao đệm cho một dòng các dải ngang
Mã của tôi hiện trông giống như sau:
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*/
}
}
}
phương pháp tiếp cận tôi đã lấy có không làm việc là:
- 1+ đề Populating một ArrayBlockingQueue, và tốn nhiều vòng lặp chính của tôi và điền vào các mảng (các boxing/unboxing là kẻ giết người ở đây)
- Tạo các vectơ với một Callable (năng suất một tương lai) trong khi làm các phần không phụ thuộc của toán học (nó xuất hiện trên đầu của bất đẳng thức lớn hơn bất kỳ lợi ích song song nào tôi nhận được)
- Sử dụng 2 ArrayBlockingQueue, mỗi chuỗi được điền bởi một chuỗi, một cho ngắn và một cho mảng dài (vẫn còn gần gấp đôi so với luồng đơn trực tiếp trường hợp).
Tôi không tìm kiếm "giải pháp" cho vấn đề cụ thể của mình nhiều như cách xử lý trường hợp chung tạo ra dòng lớn nhỏ, độc lập nguyên thủy song song và tiêu thụ chúng từ một chuỗi đơn.
@Gray quá đúng. Đến gần hơn để trả lời câu hỏi. –
Đã thêm ví dụ về cách sử dụng Bộ trao đổi để tạo số ngẫu nhiên theo lô trong nền. –
Một sự kết hợp của một bộ trao đổi để giao tiếp và chunking dòng suối dài hơn đã làm rất nhiều cho hiệu suất. Cảm ơn. – Bryce