Problema programma thread in C

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Scrivi risposta
Enrico98
Prode Principiante
Messaggi: 6
Iscrizione: giovedì 28 novembre 2019, 16:16
Desktop: ubuntu
Distribuzione: 18.04.3
Sesso: Maschile

Problema programma thread in C

Messaggio da Enrico98 » venerdì 29 novembre 2019, 13:32

Salve, sto creando un programma in C che ha l'obbiettivo di prendere tre matrici A,B,C e fare la seguente operazione: C=C+A*B, ma con i thread.
Il problema è che ho provato a mandare in esecuzione il programma con

Codice: Seleziona tutto

gcc matmatthread.c -lpthread -o matmatthread
, ma mi da il seguente errore:

Codice: Seleziona tutto

matmatthread.c: In function ‘matmatthread’:
matmatthread.c:121:4: warning: implicit declaration of function ‘pthread_create’ [-Wimplicit-function-declaration]
    pthread_create(&tid[k], NULL,thread, &argmain);
    ^~~~~~~~~~~~~~
matmatthread.c:126:18: warning: implicit declaration of function ‘pthread_join’; did you mean ‘thread’? [-Wimplicit-function-declaration]
                  pthread_join(tid[i*NTROW+j], NULL);
                  ^~~~~~~~~~~~
                  thread

Segue invio il codice del programma da me creato:

Codice: Seleziona tutto

#include"c_timer.h"
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<math.h>
 




struct argtype{
int idrow;     // identificatico thread per le righe
int idcol;     // identificatico thread per le colonne
float *A;      // puntatore alla matrice A di grandezza NxM
float *B;      // puntatore alla matrice B di grandezza MxP
float *C;      // puntatore alla matrice C di grandezza NxP
int N;
int M;
int P;
int LDA;
int LDB;
int LDC;
int NTROW;
int NTCOL;
};





void matmatthread(int ,int ,int ,float (*)[] ,float (*)[] ,float (*)[] ,int ,int ,int ,int ,int);
int exp1(int);
void  matmatikj(int,int,int, float *,float *,float *,int,int,int);







int main(){
int LDA,LDB,LDC,N,M,P,NTROW,NTCOL,i,j;
float A[500][500],B[500][500],C[500][500];
LDA=500;
LDB=500;
LDC=500;
N=8;
N=P;
N=M;
//Crea le 3 matrici
for(i=0;i<N;i++){
	for(j=0;j<M;j++){
		A[i][j]=1;
		B[i][j]=1;
		C[i][j]=1;
	}
}
//Crea vari thread per notare l'ottimizzazione dell'algoritmo e la non ottimizzazione in caso di troppi thread ( caso tuo numero di thread maggiori di 3)
for(i=1;i<4;i++){
	NTROW=exp1(i)/2;
	NTCOL=exp1(i)/2;
	matmatthread(LDA,LDB,LDC,A,B,C,N,M,P,NTROW,NTCOL);
}
}


int exp1(int i){
//Funzione esponente di 2
int j,s;
s=1;
for(j=0;j<i;j++){
s=s*2;
}
}



void  matmatikj(int LDA, int LDB, int LDC, float *A,float *B,float *C, int N, int M, int P){
// Funzione da usare per il calcolo matriciale
int i,j,k;
for(i=0;i<N;i++){
	for(k=0;k<M;k++){
		for(j=0;j<P;j++){
			*(C+i*LDC+j)=*(C+i*LDC+j)+*(A+i*LDA+k)**(B+k*LDB+j);
		}
	}
}
}










void matmatthread(int LDA,int LDB,int LDC, float A[][LDA], float B[][LDB], float C[][LDC], int N, int M,int P, int NTROW,int NTCOL){
//Funzione dei thread
        void *thread(void *) ;
        int i,j,k;
	pthread_t *tid[16];
        struct argtype argmain[16];




        for(i=0;i<NTROW;i++){
		for(j=0;j<NTCOL;j++){
			k=i*NTROW+j;
			argmain[k].idrow=i;
			argmain[k].idcol=j;
			argmain[k].A=*A;
			argmain[k].B=*B;
			argmain[k].C=*C;
			argmain[k].N=N;
			argmain[k].M=M;
			argmain[k].P=P;
			argmain[k].LDA=LDA;
			argmain[k].LDB=LDB;
			argmain[k].LDC=LDC;
			argmain[k].NTROW=NTROW;
			argmain[k].NTCOL=NTCOL;
			pthread_create(&tid[k], NULL,thread, &argmain);
		}
        }
        for(i=0;i<NTROW;i++){
		for(j=0;j<NTCOL;j++){
               		pthread_join(tid[i*NTROW+j], NULL);
		}
        }
        for(i=0;i<N;i++){
		for(j=0;j<P;j++){
			printf("%f	",C[i][j]);
		}
		printf("\n");
	}
}






void *thread (void *argmain){                 
//Funzione usata da ogni thread
        struct argtype *argthread;

        int  idrow,idcol,N,M,P,LDA,LDB,LDC,NTROW,NTCOL; 
        float *A,*B,*C;

        int j,k,i;  
 

        argthread = (struct argtype *)argmain;
	idrow=argthread->idrow;
	idcol= argthread->idcol;
        N= argthread->N;
	M=argthread->M;
	P=argthread->P;
	LDA=argthread->LDA;
	LDB=argthread->LDB;
	LDC=argthread->LDC;
	NTROW=argthread->NTROW;
	NTCOL=argthread->NTCOL;
	C=argthread->C;
	A=argthread->A;
	B=argthread->B;
//DEVI DIVIDERE LE MATRICI PER OGNI THREAD-----------------------





//POI USARE LA FUNCTION matmatikj--------------------------------





}
Qualcuno sa come posso risolvere questo problema?
PS. La libreria c_timer.h l'ho aggiunta io e non l'ho ancora usata nel programma, quindi non fateci caso.
Vi ringrazio in anticipo

Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 2 ospiti