我有一个函数可以重新排列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已在整个项目中声明为全局变量。 我想不出有任何其他方法可以将此功能更改为并行。 提前谢谢你:)