C 并行化数组的初始化
下面的代码是用C为Linux编写的。我能够并行计算数组和C 并行化数组的初始化,c,arrays,parallel-processing,C,Arrays,Parallel Processing,下面的代码是用C为Linux编写的。我能够并行计算数组和 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <pthread.h> int array_size; int num_threads; int step; int midsum_padding; int* array; int* midsum; void* sum_thread (void * arg)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
int array_size;
int num_threads;
int step;
int midsum_padding;
int* array;
int* midsum;
void* sum_thread (void * arg);
int main (int argc, char** argv) {
if(argc != 4) {
printf("Need 3 arguments\n");
return 0;
}
array_size = atoi(argv[1]);
num_threads = atoi(argv[2]);
midsum_padding = atoi(argv[3]);
int i = 0;
int final_sum = 0;
struct timeval start, end;
double elapsed;
pthread_t *tid = malloc(num_threads*sizeof(pthread_t));
int *idx = malloc(num_threads*sizeof(int));
array = malloc(array_size*sizeof(int));
midsum = malloc(num_threads*midsum_padding*sizeof(int));
step = array_size/num_threads;
for(i=0; i < array_size; i++) {
array[i] = 5;
}
gettimeofday(&start,NULL);
for(i=0; i < num_threads; i++) {
idx[i] = i;
midsum[i * midsum_padding] = 0;
pthread_create(&tid[i], NULL, sum_thread, &idx[i]);
}
for(i=0; i < num_threads; i++) {
pthread_join(tid[i], NULL);
final_sum += midsum[i * midsum_padding];
}
gettimeofday(&end, NULL);
elapsed = ((double)end.tv_sec + 0.000001*(double)end.tv_usec)-
((double)start.tv_sec + 0.000001*(double)start.tv_usec);
printf("%lf\n", elapsed);
return 0;
}
void *sum_thread (void* arg) {
int *val = arg;
int idx = *val;
int i = 0;
for (i = idx * step; i < (idx + 1) * step; i++) {
midsum[idx * midsum_padding] += array[i];
}
}
#包括
#包括
#包括
#包括
int数组的大小;
int num_线程;
整数步;
中间衬垫;
int*数组;
内*中;
void*sum_线程(void*arg);
int main(int argc,字符**argv){
如果(argc!=4){
printf(“需要3个参数\n”);
返回0;
}
数组_size=atoi(argv[1]);
num_threads=atoi(argv[2]);
中垫=atoi(argv[3]);
int i=0;
int final_sum=0;
结构timeval开始、结束;
双倍过去;
pthread_t*tid=malloc(num_threads*sizeof(pthread_t));
int*idx=malloc(num_threads*sizeof(int));
数组=malloc(数组大小*sizeof(int));
midsum=malloc(num_线程*midsum_填充*sizeof(int));
步长=数组大小/线程数;
对于(i=0;i
但是如何更改数组初始化代码,使其也可以并行化呢?也就是说,每个线程也应该进行一些数组初始化。注意,这是一个轮椅上的数组!我想知道GCC的OpenMP实现有什么问题,它让人们更喜欢使用pthread一轮又一轮地重新发明轮子。我正在学习并行编程,我相信我们应该先学习最基本的知识,以便以后能有所创新。现在我希望你知道如何帮助我:)@user3528438:因为OpenMP是一个令人讨厌的东西,而pthreads是一个相当理智的API?