Tôi có một chương trình đơn giản thực hiện một số thuật toán Monte Carlo. Một lần lặp với thuật toán là không có tác dụng phụ, vì vậy tôi có thể chạy nó với nhiều luồng. Vì vậy, đây là phần có liên quan của my whole program, được viết bằng C++ 11:Chương trình chậm hơn khi sử dụng nhiều chủ đề
void task(unsigned int max_iter, std::vector<unsigned int> *results, std::vector<unsigned int>::iterator iterator) {
for (unsigned int n = 0; n < max_iter; ++n) {
nume::Album album(535);
unsigned int steps = album.fill_up();
*iterator = steps;
++iterator;
}
}
void aufgabe2() {
std::cout << "\nAufgabe 2\n";
unsigned int max_iter = 10000;
unsigned int thread_count = 4;
std::vector<std::thread> threads(thread_count);
std::vector<unsigned int> results(max_iter);
std::cout << "Computing with " << thread_count << " threads" << std::endl;
int i = 0;
for (std::thread &thread: threads) {
std::vector<unsigned int>::iterator start = results.begin() + max_iter/thread_count * i;
thread = std::thread(task, max_iter/thread_count, &results, start);
i++;
}
for (std::thread &thread: threads) {
thread.join();
}
std::ofstream out;
out.open("out-2a.csv");
for (unsigned int count: results) {
out << count << std::endl;
}
out.close();
std::cout << "Siehe Plot" << std::endl;
}
Điều khó hiểu là nó chậm hơn các chủ đề tôi thêm vào. Với 4 chủ đề, tôi có được điều này:
real 0m5.691s
user 0m3.784s
sys 0m10.844s
Trong khi đó với một chủ đề duy nhất:
real 0m1.145s
user 0m0.816s
sys 0m0.320s
Tôi nhận ra rằng việc chuyển dữ liệu giữa các lõi CPU có thể thêm chi phí, nhưng vector
cần được khai báo lúc khởi động, và không được sửa đổi ở giữa. Có bất kỳ lý do cụ thể cho việc này để được chậm hơn trên nhiều lõi?
hệ thống của tôi là một i5-2550M, trong đó có 4 lõi (2 + Siêu phân luồng) và tôi sử dụng g ++ (Ubuntu/Linaro 4.7.3-1ubuntu1) 4.7.3
Cập nhật
tôi thấy rằng không sử dụng chủ đề (1), nó sẽ có rất nhiều người sử dụng tải, trong khi với chủ đề (2), nó sẽ có kernel hơn người dùng tải:
10K Chạy:
http://wstaw.org/m/2013/05/08/stats3.png
100K Chạy:
http://wstaw.org/m/2013/05/08/Auswahl_001.png
Với 100K chạy, tôi nhận được như sau:
Không đề ở tất cả:
real 0m28.705s
user 0m28.468s
sys 0m0.112s
Một chủ đề cho từng phần của chương trình. Những bộ phận đó thậm chí không sử dụng cùng một bộ nhớ, vì vậy tôi đồng thời cho cùng một container nên được ra là tốt. Nhưng phải mất nhiều thời gian hơn:
real 2m50.609s
user 2m45.664s
sys 4m35.772s
Vì vậy, mặc dù ba phần chính chiếm 300% CPU của tôi, chúng mất gấp 6 lần.
Với thời gian chạy 1M, phải mất real 4m45
để thực hiện. Tôi đã chạy trước đây 1 triệu và phải mất ít nhất real 20m
, nếu không ngay cả real 30m
.
'10000' thực sự nhỏ ... hãy thử số lớn hơn. – UmNyobe
Có lẽ bối cảnh trên đầu chuyển đổi là thống trị thời gian cần thiết để thực hiện nhiệm vụ ở đây. Như được đề xuất, hãy thêm một vài số không vào đó '10000' ... –
Tạo một chuỗi cũng có phí trên. Cho phép tác vụ thực hiện một 'return' đơn giản và xem số lượng các số đó là tính toán thực tế như thế nào. Ngoài ra cố gắng không tạo chủ đề nào cả (chỉ cần chạy hàm tác vụ từ hiện tại), nó sẽ nhanh hơn. 10K lặp đi lặp lại có lẽ không có gì so với những gì hệ điều hành đã làm để khởi động một chủ đề. – hamstergene