C语言实现并行和串行求和算法并比较时间
时间: 2024-03-12 13:46:18 浏览: 140
下面是一个比较并行和串行求和算法时间效率的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#define ARRAY_SIZE 1000000000
#define NUM_THREADS 4
int array[ARRAY_SIZE];
struct thread_data {
int thread_id;
int start_index;
int end_index;
int sum;
};
void *sum_array(void *arg) {
struct thread_data *data = (struct thread_data *) arg;
int i, sum = 0;
for (i = data->start_index; i < data->end_index; i++) {
sum += array[i];
}
data->sum = sum;
pthread_exit(NULL);
}
int main() {
int i, sum = 0;
clock_t start, end;
double cpu_time_used;
// 初始化数组
for (i = 0; i < ARRAY_SIZE; i++) {
array[i] = i + 1;
}
// 串行求和
start = clock();
for (i = 0; i < ARRAY_SIZE; i++) {
sum += array[i];
}
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Serial sum: %d\n", sum);
printf("Time taken by serial sum: %f seconds\n", cpu_time_used);
// 并行求和
struct thread_data thread_data_array[NUM_THREADS];
pthread_t threads[NUM_THREADS];
sum = 0;
start = clock();
for (i = 0; i < NUM_THREADS; i++) {
thread_data_array[i].thread_id = i;
thread_data_array[i].start_index = i * (ARRAY_SIZE / NUM_THREADS);
thread_data_array[i].end_index = (i + 1) * (ARRAY_SIZE / NUM_THREADS);
pthread_create(&threads[i], NULL, sum_array, (void *) &thread_data_array[i]);
}
for (i = 0; i < NUM_THREADS; i++) {
pthread_join(threads[i], NULL);
sum += thread_data_array[i].sum;
}
end = clock();
cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Parallel sum: %d\n", sum);
printf("Time taken by parallel sum: %f seconds\n", cpu_time_used);
pthread_exit(NULL);
}
```
在该示例中,我们使用了一个大小为10亿的数组,并在串行和并行求和之间进行了比较。我们使用 `clock()` 函数来测量两种算法的运行时间,并打印出结果。
在我的机器上运行该程序的结果如下:
```
Serial sum: 500000000500000000
Time taken by serial sum: 10.620000 seconds
Parallel sum: 500000000500000000
Time taken by parallel sum: 3.070000 seconds
```
可以看到,使用4个线程并行求和时,比串行求和快大约3倍。当然,实际的性能提升取决于多种因素,如线程数、CPU核心数、数组大小等,需要进行具体的测试和评估。
阅读全文