Estoy jugando con subprocesos en C++, en particular usándolos para paralelizar una operación de mapa.C + + sobrecarga de subprocesos
Aquí está el código:
#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);
}
Con multByTwo
la versión paralela es en realidad un poco más lenta (1,01 frente a 0,95 segundos en tiempo real), y con su doJunk (51 frente a 136 en tiempo real) más rápido. Esto implica para mí que
- la paralelización está trabajando, y
- hay una muy gran sobrecarga con declarar nuevos temas. ¿Alguna idea de por qué la sobrecarga es tan grande y cómo puedo evitarla?
Tenga en cuenta que esto no es necesariamente específico para * hilos nativos en C++ *, sino la * implementación * y el compilador que utiliza. Como tal, es difícil dar una respuesta definitiva. – zxcdw
¿Con qué hardware está ejecutando este código? Tipo de procesador y número de enchufes? ¿RAM? OS? ¿Versión del compilador? –