C 并行化数组的初始化

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)

下面的代码是用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);

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?