Tôi đang chơi xung quanh với các chủ đề trong C++, đặc biệt là sử dụng chúng để song song một hoạt động bản đồ.C++ thread overhead
Dưới đây là các mã:
#include <thread>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <math.h>
#include <stdio.h>
double multByTwo(double x){
return x*2;
}
double doJunk(double x){
return cos(pow(sin(x*2),3));
}
template <typename T>
void map(T* data, int n, T (*ptr)(T)){
for (int i=0; i<n; i++)
data[i] = (*ptr)(data[i]);
}
template <typename T>
void parallelMap(T* data, int n, T (*ptr)(T)){
int NUMCORES = 3;
std::vector<std::thread> threads;
for (int i=0; i<NUMCORES; i++)
threads.push_back(std::thread(&map<T>, data + i*n/NUMCORES, n/NUMCORES, ptr));
for (std::thread& t : threads)
t.join();
}
int main()
{
int n = 1000000000;
double* nums = new double[n];
for (int i=0; i<n; i++)
nums[i] = i;
std::cout<<"go"<<std::endl;
clock_t c1 = clock();
struct timespec start, finish;
double elapsed;
clock_gettime(CLOCK_MONOTONIC, &start);
// also try with &doJunk
//parallelMap(nums, n, &multByTwo);
map(nums, n, &doJunk);
std::cout << nums[342] << std::endl;
clock_gettime(CLOCK_MONOTONIC, &finish);
printf("CPU elapsed time is %f seconds\n", double(clock()-c1)/CLOCKS_PER_SEC);
elapsed = (finish.tv_sec - start.tv_sec);
elapsed += (finish.tv_nsec - start.tv_nsec)/1000000000.0;
printf("Actual elapsed time is %f seconds\n", elapsed);
}
Với multByTwo
phiên bản song song thực sự là hơi chậm (1,01 giây so với 0,95 thời gian thực), và với doJunk nhanh hơn (51 so với 136 thời gian thực) của nó. Điều này ngụ ý với tôi rằng
- sự song song đang làm việc, và
- có một trên không thực sự lớn với tuyên bố chủ đề mới. Bất kỳ suy nghĩ nào về lý do tại sao chi phí quá lớn, và làm thế nào tôi có thể tránh được nó?
Lưu ý rằng điều này không nhất thiết phải cụ thể đối với * chuỗi gốc trong C++ *, nhưng * triển khai * và trình biên dịch bạn sử dụng. Như vậy, thật khó để đưa ra một câu trả lời dứt khoát. – zxcdw
Bạn đang chạy mã phần cứng nào? Loại bộ xử lý và số lượng ổ cắm? RAM? Hệ điều hành? Phiên bản trình biên dịch? –