#include "check.h" #include #include #include #include #include #include const std::size_t N = 50, M = N * N; const int A = 1, B = 2; int v1[N][M], v2[M][M], *v3; // pointer to shared memory void init_v3() { int fd = check(shm_open("/v3", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR)); check(ftruncate(fd, sizeof(v1))); v3 = (int *)check( mmap(NULL, sizeof(v1), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)); } struct initializer { initializer(): father(getpid()) { init_v3(); for (std::size_t i = 0; i < N; ++i) for (std::size_t j = 0; j < M; ++j) { v1[i][j] = A; v3[i * M + j] = 0; } for (std::size_t i = 0; i < M; ++i) for (std::size_t j = 0; j < M; ++j) v2[i][j] = B; } ~initializer() { if (getpid() == father) { std::size_t sum = 0; for (std::size_t i = 0; i < N; ++i) for (std::size_t j = 0; j < M; ++j) sum += v3[i * M + j]; assert(sum == A * B * M * M * N); } } pid_t father; } _; void work(std::size_t begin, std::size_t end) { init_v3(); for (std::size_t i = begin; i < end; ++i) for (std::size_t k = 0; k < M; ++k) for (std::size_t j = 0; j < M; ++j) v3[i * M + j] += v1[i][k] * v2[k][j]; }