Używam wątków w C++, w szczególności za pomocą ich do równoległego działania mapy.C++ over wątku
Oto kod:
#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);
}
z multByTwo
wersja równoległego jest rzeczywiście nieznacznemu zmniejszeniu (1.01 sekund w porównaniu .95 czasie rzeczywistym) oraz z doJunk szybszym (51 w porównaniu do 136 w czasie rzeczywistym). Oznacza to dla mnie, że
- zrównoleglanie pracuje, a
- tam jest naprawdę duży narzut z deklarowania nowe wątki. Wszelkie przemyślenia, dlaczego obciążenie jest tak duże i jak mogę tego uniknąć?
Należy zauważyć, że niekoniecznie jest to specyficzne dla * natywnych wątków w C++ *, ale * implementacja * i kompilator, którego używasz. W związku z tym trudno jest udzielić jednoznacznej odpowiedzi. – zxcdw
Jakiego sprzętu używasz tego kodu? Typ procesora i liczba gniazd? BARAN? OS? Wersja kompilatora? –