Tôi đang thử trên các chủ đề C++ 11 mới, nhưng bài kiểm tra đơn giản của tôi có hiệu năng đa lõi không hoạt động. Như một ví dụ đơn giản, chương trình này cho biết thêm một số số ngẫu nhiên bình phương.Tại sao mã C++ 11 này có chứa rand() chậm hơn với nhiều luồng hơn so với một?
#include <iostream>
#include <thread>
#include <vector>
#include <cstdlib>
#include <chrono>
#include <cmath>
double add_single(int N) {
double sum=0;
for (int i = 0; i < N; ++i){
sum+= sqrt(1.0*rand()/RAND_MAX);
}
return sum/N;
}
void add_multi(int N, double& result) {
double sum=0;
for (int i = 0; i < N; ++i){
sum+= sqrt(1.0*rand()/RAND_MAX);
}
result = sum/N;
}
int main() {
srand (time(NULL));
int N = 1000000;
// single-threaded
auto t1 = std::chrono::high_resolution_clock::now();
double result1 = add_single(N);
auto t2 = std::chrono::high_resolution_clock::now();
auto time_elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count();
std::cout << "time single: " << time_elapsed << std::endl;
// multi-threaded
std::vector<std::thread> th;
int nr_threads = 3;
double partual_results[] = {0,0,0};
t1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < nr_threads; ++i)
th.push_back(std::thread(add_multi, N/nr_threads, std::ref(partual_results[i])));
for(auto &a : th)
a.join();
double result_multicore = 0;
for(double result:partual_results)
result_multicore += result;
result_multicore /= nr_threads;
t2 = std::chrono::high_resolution_clock::now();
time_elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count();
std::cout << "time multi: " << time_elapsed << std::endl;
return 0;
}
Biên soạn với 'g ++ -std = C++ 11 -pthread test.cpp' trên Linux và một máy 3core, kết quả thu được là
time single: 33
time multi: 565
Vì vậy, đa phiên bản ren hơn một thứ tự cường độ chậm hơn. Tôi đã sử dụng số ngẫu nhiên và một sqrt để làm cho ví dụ ít tầm thường và dễ bị tối ưu hóa trình biên dịch, vì vậy tôi không có ý tưởng.
chỉnh sửa:
- Vấn đề này quy mô lớn hơn cho N, vì vậy vấn đề không phải là thời gian chạy ngắn
- Thời gian tạo chủ đề không phải là vấn đề. Việc loại trừ nó không làm thay đổi kết quả đáng kể
Tôi đã phát hiện ra vấn đề. Nó thực sự là rand(). Tôi đã thay thế nó bằng một tương đương C++ 11 và giờ đây quy mô thời gian chạy hoàn hảo. Cảm ơn mọi người!
Không thể tái tạo. Bạn đang sử dụng mức tối ưu hóa nào? –
Bạn đang đo thuật toán + ** thời gian tạo chuỗi chậm do cuộc gọi hệ thống **. Di chuyển bộ đếm thời gian sau khi tạo chủ đề và sau đó chạy chuỗi. – deepmax
'rand()' không phải là một chức năng an toàn đa tread nói chung. Sử dụng 'rand_r()'. –