Ich habe den folgenden Code geschrieben. Wenn ich einen einzelnen Thread verwende (aa = 1 im Code), dauert es 11 Sekunden. Aber für aa = 2 dauert es 190 Sekunden. Jedoch hat meine Maschine 4 CPUs. Wirst du mir bitte helfen? Ich bin Kompilieren alsLangsame Multithread-Programmierung in C bei mehr als einem Thread
gcc Thread.c O3
#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);
}
Basierend auf Vorschlag -lpthread, ich habe den Code geändert. Obwohl die Ausführungszeit jetzt in Ordnung ist, ist die Zufallszahlengenerierung nicht in Ordnung. Die Werte des Array-Regs im Code sind gleich. Bitte hilf mir.
#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);
}
nicht lösen Ihr Problem aber 1) wirft nicht die Ergebnisse eines 'malloc()' 2) Sie nie testen den Rückgabewert von Ihrem 'malloc()' nennt – KevinDTimm
Sie können aber auch das Profil Dein Code, um herauszufinden, wo er die meiste Zeit verbringt. – KevinDTimm
Hav hast du gezählt, wie oft deine Schleife in 'abc()' zusammen mit aa = 1 und mit aa = 2 (von irgendeinem Thread) durchlaufen wird? Sobald Sie haben, kommen Sie zurück und ändern Sie Ihre Frage. Tipp: Deine Threads teilen * keine * Arbeit * – tofro