В настоящее время я выполняю задание, которое предполагает использование многопоточности и многопроцессорного программирования в первый раз.Кажется, я наткнулся на многопроцессорное программирование и случайно увеличил производительность примерно на ~ 20%, но я не могу сказать вам, что понимаю это.К сожалению, мне еще не повезло полностью выяснить pthreads, и я почти не понимаю, как это на самом деле работает .Без лишних слов, вот код, который я пытаюсь правильно разделить.
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <errno.h>
#include <sys/time.h>
#define DATASIZE (4<<20)
int main()
{
double A[200][200];
double B[200][200];
double C[200][200];
int i, j, k, m;
int outfile, result, count;
unsigned seed;
struct timeval before, after;
char *buff;
buff = (char *)malloc(sizeof(char)*(16<<20));
srandom(seed);
for (i=0; i<200; i++)
for (j=0; j<200; j++) {
A[i][j] = random()/100.0;
B[i][j] = random()/100.0;
}
gettimeofday(&before, NULL);
for (m=0 ; m < 100; m++) {
/* Computation */
/* This is what we're trying to split into one thread*/
for (i=0; i<200; i++)
for (j=0; j<200; j++) {
C[i][j] = 0;
for (k=0; k<200; k++)
C[i][j] += A[i][k]*B[k][j];
}
/* I/O */
/*And this is what we'll put in the other thread*/
outfile = open("testfile", O_RDWR|O_CREAT|O_APPEND, 0777);
if (outfile <= 0)
perror("Error opening file\n");
else {
result = write(outfile, buff, DATASIZE);
if (result <= 0)
perror("Error writing file\n");
}
close(outfile);
}
free(buff);
gettimeofday(&after, NULL);
count = (after.tv_sec - before.tv_sec) * 1e6;
count += (after.tv_usec - before.tv_usec);
printf("Total time for single process in usec: %d\n", count);
return 0;
};
Из немногих бесполезных примеров, которые я блестел из интернета, они показывают, что эти две вещи разбиты на внешние функции вне основного.функция.Тогда я должен был бы передать их в pthread_create следующим образом:
/*I would declare the pthread_t* vars higher in the code*/
pthread_create(pthread_t* first,NULL,/*function name*/,NULL);
pthread_create(pthread_t* second,NULL,/*second function name*/,NULL);
pthread_join(pthread_t* first,NULL);
pthread_join(pthread_t* second,NULL);
Это действительно так "просто"?Требуется ли создавать новые внешние функции или я могу как-то сохранить их в основном и использовать pthread?Я упускаю какую-то важную часть понимания того, как работает pthread и как его использовать в будущем?