Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <fcntl.h>
- #include <sys/mman.h>
- #include <sys/stat.h>
- #include <sys/types.h>
- #include <unistd.h>
- typedef struct {
- int mat_size;
- int submat_size;
- int* submatA;
- int* submatB;
- int* submatC;
- } matrix_struct;
- int* createMatrix(char *nazwa, int size) {
- int *matrix = NULL;
- int fd;
- if ((fd = shm_open(nazwa, O_RDWR | O_CREAT, 0666)) == -1)
- perror("Błąd otwarcia SHM");
- if ((ftruncate(fd, size)) == -1)
- perror("Błąd ustalenia wielkości SHM");
- if ((matrix = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED)
- perror("Błąd mapowania pamięci");
- close(fd);
- return matrix;
- }
- void loadMatrix(int fd, int msize, int* matrix) {
- lseek(fd, 1, SEEK_CUR);
- int i, j, n;
- for (i = 0; i < msize; i++)
- for (j = 0; j < msize; j++) {
- read(fd, &n, 1);
- n = n - 48;
- matrix[msize * i + j] = n;
- lseek(fd, 1, SEEK_CUR);
- }
- }
- matrix_struct loadMatrixes(char* filename) {
- matrix_struct matrix;
- matrix.mat_size = 0;
- int size, i, j;
- int fd = open(filename,O_RDONLY);
- read(fd, &matrix.mat_size, 1);
- matrix.mat_size = matrix.mat_size - 48;
- lseek(fd, 1, SEEK_CUR);
- size = matrix.mat_size * matrix.mat_size * sizeof(int);
- matrix.submatA = createMatrix("/shm_matrix1", size);
- matrix.submatB = createMatrix("/shm_matrix2", size);
- matrix.submatC = createMatrix("/shm_matrix3", size);
- loadMatrix(fd, matrix.mat_size, matrix.submatA);
- loadMatrix(fd, matrix.mat_size, matrix.submatB);
- for (i = 0; i < matrix.mat_size; i++)
- for (j = 0; j < matrix.mat_size; j++)
- matrix.submatC[matrix.mat_size * i + j] = 0;
- return matrix;
- }
- void showMatrix(int *matrix, int msize, int mvo, int mho, int size) {
- int i, j;
- for (i = mvo; i < mvo + size; i++) {
- for (j = mho; j < mho + size; j++)
- printf("[%3d] ", matrix[msize * i + j]);
- puts("");
- }
- puts("");
- }
- void multiplyMatrixes(matrix_struct matrix) {
- int i, j, k, tmp;
- for (i = 0; i < matrix.submat_size; i++)
- for (j = 0; j < matrix.submat_size; j++) {
- tmp = 0;
- for (k = 0; k < matrix.submat_size; k++)
- tmp += matrix.submatA[matrix.mat_size * i + k] * matrix.submatB[matrix.mat_size * k + j];
- matrix.submatC[matrix.mat_size * i + j] = tmp;
- }
- }
- int main (int argc, char* argv[]) {
- matrix_struct matrix = loadMatrixes("mac.txt");
- matrix.submat_size = matrix.mat_size;
- multiplyMatrixes(matrix);
- showMatrix(matrix.submatA, matrix.mat_size, 0, 0, matrix.mat_size);
- showMatrix(matrix.submatB, matrix.mat_size, 0, 0, matrix.mat_size);
- showMatrix(matrix.submatC, matrix.mat_size, 0, 0, matrix.mat_size);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment