Pthread比串行版慢

时间:2016-11-26 16:41:19

标签: c pthreads

我有一个函数可以重新排列N个粒子表中的一些数据,我试图将它转换为并行。 它的串行版本如下:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"


#define DIM 3


void data_rearrangement(float *Y, float *X, 
            unsigned int *permutation_vector, 
            int N){
  for(int i=0; i<N; i++){
    memcpy(&Y[i*DIM], &X[permutation_vector[i]*DIM], DIM*sizeof(float));
  }

}

我所做的并行版本如下:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "utils.h"
#include <pthread.h>

#define DIM 3

struct data{
    float *Y;
    float *X;
    unsigned int *permutation_vector;
    int N;
};

void *threaded_data_rearrangement(void *args){

  struct data *new_data;
  new_data = (struct data *) args;

  for(int i=0; i<new_data->N/NUM_THREADS; i++){
    memcpy(&new_data->Y[i*DIM], &new_data->X[new_data->permutation_vector[i]*DIM], DIM*sizeof(float));
  }

}

void data_rearrangement(float *Y, float *X,
            unsigned int *permutation_vector,
            int N){
  void *status;
  int rc;
  struct data data_array[NUM_THREADS];
  pthread_t threads[NUM_THREADS];
  int k;

  for (k=0; k<NUM_THREADS; k++){
    data_array[k].Y = Y;
    data_array[k].X = X;
    data_array[k].permutation_vector = permutation_vector;
    data_array[k].N = N;

    pthread_create(&threads[k], NULL, threaded_data_rearrangement, (void *)&data_array[k]);
  }

  for(k=0; k<NUM_THREADS; k++){
    rc = pthread_join(threads[k], &status);
    if (rc) {
      printf("ERROR; return code from pthread_join() is %d\n",rc);
      exit(-1);
    }
  }

}

有人可以解释一下,为什么并行版本会变慢? *请注意,NUM_THREADS已在整个项目中声明为全局变量。 我想不出有任何其他方法可以将此功能更改为并行。 提前谢谢你:)

0 个答案:

没有答案