Я пишу код для параллельного суммирования массива с C ++ std :: thread.
Но параллельная сумма занимает 0,6 с, а последовательная - 0,3 с.
Я не думаю, что этот код выполняет какую-либо синхронизацию на arr
или ret
.
Почему такая ситуация происходит?
Мой процессор - i7-8700, который имеет 6 физических ядер.
#include <stdio.h>
#include <ctime>
#include <thread>
// Constants
#define THREADS 4
#define ARR_SIZE 200000000
int ret[THREADS];
// Function for thread.
void parallel_sum(int *arr, int thread_id) {
int s = ARR_SIZE / THREADS * thread_id, e = ARR_SIZE / THREADS * (thread_id + 1);
printf("%d, %d\n", s, e);
for (int i = s; i < e; i++) ret[thread_id] += arr[i];
}
int main() {
// Variable definitions
int *arr = new int[ARR_SIZE]; // 1 billion
time_t t1, t2; // Variable for time consuming checking
std::thread *threads = new std::thread[THREADS];
// Initialization
for (int i = 0; i < ARR_SIZE; i++) arr[i] = 1;
for (int i = 0; i < THREADS; i++) ret[i] = 0;
long long int sum = 0;
// Parallel sum start
t1 = clock();
for (int i = 0; i < THREADS; i++) threads[i] = std::thread(parallel_sum, arr, i);
for (int i = 0; i < THREADS; i++) threads[i].join();
t2 = clock();
for (int i = 0; i < THREADS; i++) sum += ret[i];
printf("[%lf] Parallel sum %lld \n", (float)(t2 - t1) / (float)CLOCKS_PER_SEC, sum);
// Parallel sum end
sum = 0; // Initialization
// Sequential sum start
t1 = clock();
for (int i = 0; i < ARR_SIZE; i++) sum += arr[i];
t2 = clock();
printf("[%lf] Sequential sum %lld \n", (float)(t2 - t1) / (float)CLOCKS_PER_SEC, sum);
// Sequential sum end
return 0;
}