Problema programma thread in C

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
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, 17:47

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

Avatar utente
Actarus5
Prode Principiante
Messaggi: 193
Iscrizione: mercoledì 3 luglio 2013, 17:15
Desktop: Mate
Distribuzione: Fedora
Località: Abutalabashuneba

Re: Problema programma thread in C

Messaggio da Actarus5 » venerdì 29 novembre 2019, 18:42

Al di là del codice, a me il warning che ricevi sembra piuttosto intuitivo, specialmente per uno che si cimenta coi thread che non sono un argomento base. Ovviamente manca:

Codice: Seleziona tutto

#include <pthread.h>
"An extremely helpful console message: “SPANK! SPANK! SPANK! Naughty programmer!”. Really, I’m not joking about that one."

Enrico98
Prode Principiante
Messaggi: 6
Iscrizione: giovedì 28 novembre 2019, 16:16
Desktop: ubuntu
Distribuzione: 18.04.3
Sesso: Maschile

Re: Problema programma thread in C

Messaggio da Enrico98 » venerdì 29 novembre 2019, 18:55

Actarus5 [url=https://forum.ubuntu-it.org/viewtopic.php?p=5164754#p5164754][img]https://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Al di là del codice, a me il warning che ricevi sembra piuttosto intuitivo, specialmente per uno che si cimenta coi thread che non sono un argomento base. Ovviamente manca:

Codice: Seleziona tutto

#include <pthread.h>
Grazie, non mi ero accorto di non aver riaggiunto la libreria (scusa la mia sbadatezza).
L'output del terminale che mi sta dando un po' di rogne è questo:

Codice: Seleziona tutto

matmatthread.c: In function ‘matmatthread’:
matmatthread.c:122:19: warning: passing argument 1 of ‘pthread_create’ from incompatible pointer type [-Wincompatible-pointer-types]
    pthread_create(&tid[k], NULL,thread, &argmain);
                   ^
In file included from matmatthread.c:2:0:
/usr/include/pthread.h:234:12: note: expected ‘pthread_t * restrict {aka long unsigned int * restrict}’ but argument is of type ‘pthread_t ** {aka long unsigned int **}’
 extern int pthread_create (pthread_t *__restrict __newthread,
            ^~~~~~~~~~~~~~
matmatthread.c:127:31: warning: passing argument 1 of ‘pthread_join’ makes integer from pointer without a cast [-Wint-conversion]
                  pthread_join(tid[i*NTROW+j], NULL);
                               ^~~
In file included from matmatthread.c:2:0:
/usr/include/pthread.h:251:12: note: expected ‘pthread_t {aka long unsigned int}’ but argument is of type ‘pthread_t * {aka long unsigned int *}’
 extern int pthread_join (pthread_t __th, void **__thread_return);
Grazie in anticipo

Avatar utente
Vincenzo1968
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 450
Iscrizione: lunedì 14 gennaio 2013, 14:21
Desktop: Unity
Distribuzione: Ubuntu 18.04.3 LTS x86_64
Località: Villabate(PA)
Contatti:

Re: Problema programma thread in C

Messaggio da Vincenzo1968 » venerdì 29 novembre 2019, 20:48

Il primo warning ti dice che stai passando un puntatore a puntatore quando, invece, la funzione pthread_create si aspetta un puntatore.

tid è un array di puntatori a pthread_t, e, dunque, per passare il semplice puntatore, devi chiamare la funzione così:

Codice: Seleziona tutto

pthread_create(tid[k], NULL,thread, &argmain);
Per il secondo warning: la funzione pthread_join si aspetta di ricevere un argomento di tipo pthread_t e non un puntatore ad esso.
La funziona va chiamata così:

Codice: Seleziona tutto

pthread_join(*(tid[i*NTROW+j]), NULL);
È ormai difficile incontrare un cretino che non sia intelligente e un intelligente che non sia un cretino. [...] Oh i bei cretini di una volta! Genuini, integrali. Come il pane di casa. Come l'olio e il vino dei contadini. (da "Nero su nero" di Leonardo Sciascia)

Enrico98
Prode Principiante
Messaggi: 6
Iscrizione: giovedì 28 novembre 2019, 16:16
Desktop: ubuntu
Distribuzione: 18.04.3
Sesso: Maschile

Re: Problema programma thread in C

Messaggio da Enrico98 » venerdì 29 novembre 2019, 21:23

Grazie mille

Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 3 ospiti