次のコードを記述しました。私がシングルスレッド(コードでaa = 1)を使用している場合、11秒かかります。しかし、aa = 2の場合、190秒かかる。私のマシンは4CPUです。親切に私を助けてくれますか?私は提案に基づき-032つ以上のスレッドを使用する場合、Cでのマルチスレッドプログラミングが遅い
#include<stdio.h>
#include<pthread.h>
#include <time.h>
#include<stdlib.h>
#define N 100
int aa;
unsigned long long *reg, *b;
#define LIMIT 5000000
void *abc(void* arg){
srand(time(NULL));
unsigned long long i,l;
unsigned char z,j;
int *limit_ptr=(int *)arg;
int i1=*limit_ptr;
printf("i1=%d\n",i1);
for(l=0;l<LIMIT;l++){
for(i=0;i<N;i++)
z=(((double) N)*rand()/(RAND_MAX+1.0));;
z = (((double) N)*rand()/(RAND_MAX+1.0));;
if(z==0)
reg[i1]++;
}
}
int main(){
int l;
aa=2;
printf("%d \n\n",aa);
reg = (unsigned long long *) malloc(aa * sizeof(unsigned long long));
b = (unsigned long long *) malloc(aa * sizeof(unsigned long long));
struct timespec start, finish;
double elapsed;
clock_gettime(CLOCK_MONOTONIC, &start);
for(l=0;l<aa;l++)
reg[l]=0;
pthread_t tid[aa];
int j1;
unsigned long long cc=0;
for(j1=0;j1<aa;j1++)
b[j1]=j1;
for(j1=0;j1<aa;j1++){
printf("%d\n", j1);
pthread_create(&tid[j1],NULL,abc,&b[j1]);
}
//
for(j1=0;j1<aa;j1++){
pthread_join(tid[j1],NULL);
printf("%d\n", j1);
}
for(j1=0;j1<aa;j1++)
cc=cc+reg[j1];
printf("%0.10f %llu\n", (double)cc/(aa*LIMIT),cc);
clock_gettime(CLOCK_MONOTONIC, &finish);
elapsed = (finish.tv_sec - start.tv_sec);
elapsed += (finish.tv_nsec - start.tv_nsec)/1000000000.0;
printf("Time=%0.10f\n", elapsed);
pthread_exit(NULL);
}
を-lpthread Thread.c
gccのようにコンパイルしています、私は、コードを変更しました。実行時間は今は大丈夫ですが、乱数の生成はうまくいきません。コード内の配列regの値は同じです。私を助けてください。私はこれでEOFに同意する必要が
#include<stdio.h>
#include<pthread.h>
#include <time.h>
#include<stdlib.h>
#include <sched.h>
#define N 100
#define aa 4
unsigned long long *reg, *b;
#define LIMIT 5000000
int rgen()
{
int xi;
int seed;
struct drand48_data drand_buf;
double x;
static i;
if (i==0){
seed = time(NULL);
srand48_r(seed, &drand_buf);
i = 10;
}
drand48_r (&drand_buf, &x);
xi = (int) (x * 100);
return xi;
}
void *abc(void* arg){
int l,i, z;
int *limit_ptr = (int *) arg;
int i1 = *limit_ptr;
printf("i1=%d\n",i1);
for(l=0; l<LIMIT; l++){
for(i=0; i<N; i++)
z= rgen(i1);
if(z==0)
reg[i1]++;
}
}
int main(){
int l;
printf("%d \n\n",aa);
reg = (unsigned long long *) malloc(aa * sizeof(unsigned long long));
b = (unsigned long long *) malloc(aa * sizeof(unsigned long long));
struct timespec start, finish;
double elapsed;
clock_gettime(CLOCK_MONOTONIC, &start);
for(l=0;l<aa;l++)
reg[l]=0;
pthread_t tid[aa];
int j1;
unsigned long long cc=0;
for(j1=0;j1<aa;j1++)
b[j1]=j1;
for(j1=0;j1<aa;j1++){
printf("%d\n", j1);
pthread_create(&tid[j1],NULL,abc,&b[j1]);
}
//
printf("created threads\n");
for(j1=0;j1<aa;j1++){
pthread_join(tid[j1],NULL);
printf("%d\n", j1);
}
for(j1=0;j1<aa;j1++)
cc=cc+reg[j1];
printf("\n");
for(j1=0;j1<aa;j1++)
printf("%llu ", reg[j1]);
printf("\n");
printf("%0.10f %llu\n", (double)cc/(aa*LIMIT),cc);
clock_gettime(CLOCK_MONOTONIC, &finish);
elapsed = (finish.tv_sec - start.tv_sec);
elapsed += (finish.tv_nsec - start.tv_nsec)/1000000000.0;
printf("Time=%0.10f\n", elapsed);
pthread_exit(NULL);
}
1) 'malloc()'の結果をキャストしない 2)あなたの 'malloc()'呼び出しの戻り値を決してテストしない – KevinDTimm
また、あなたのコードは、ほとんどの時間を費やしている場所を見つけることができます。 – KevinDTimm
Havは、 'abc()'のループがaa = 1とaa = 2(どのスレッドでも)一緒に横断されている頻度を数えましたか?いったん持っていたら、戻って質問を修正してください。ヒント:あなたのスレッドは何も共有していません – tofro