Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.03.2015, 22:22   #1
Kr@ShAK
Пользователь
 
Регистрация: 17.12.2013
Сообщений: 11
Восклицание Проблемы с памятью при умножении матриц (параллельно)

Здравствуйте, такая проблема, хочу реализовать параллельное умножение матриц размерам: 200, 400 и 800 каждое из умножений происходит 3 раза т.е. последовательно, на 2 потока и на 4 потока (делю с помощью библиотеки omp если в Visual Studio нужно включить "Проект-свойства-Свойства конфигурации- C/C++ -Язык" и в "Подержка Open MP" поставить "да(/openmp)" в Linux компилировать с ключом -fopenmp ), доходя до парализации уже на матрице с 200 (деление на 2 потока) выдает ошибку "Нарушение прав доступа при чтении "0xfdfdfea1"."
P.S. Раньше писал код полностью отдельно (т.е. для матрицы 200 отдельно последовательно, отдельно на 2 потока, отдельно на 4) и без выделения памяти, все работало, а как все объединил и начал использовать динамическое выделение памяти все стало падать.

Вот сам код:
Код:
#include <stdio.h>
#include <stdlib.h> 
#include <omp.h>
#include <time.h>

#define N 200

int i,j,m;
double time_start, time_finish;

void Generate(int **a, int count){
	for (i = 0; i < N*count; i++)
		for (j = 0; j < N*count; j++)
			a[i][j] = rand()%100;
}

void matr(int** mat1,int** mat2,int** ItogMat,int count)
{
	for(j=0; j<N*count; j++)
	 	for(m=0; m<N*count; m++)
			ItogMat[i][j]+=mat1[i][m]*mat2[m][j]; //Ругается тут
}


int main() {
	char posl[] = "sequential execution";
	char two_th[] = "two threading version";
	char four_th[] = "four threading version";
	int count = 0, count_size=1;

	FILE *Log;
	srand(time(NULL));

	do {
		int **mat1 = (int**)malloc(N*count_size*sizeof(int*));
		int **mat2 = (int**)malloc(N*count_size*sizeof(int*));
		int **ItogMat = (int**)malloc(N*count_size*sizeof(int*));
		for (i = 0; i < N*count_size; i++) {
			mat1[i] = (int*)malloc(N*count_size*sizeof(int));
			mat2[i] = (int*)malloc(N*count_size*sizeof(int));
			ItogMat[i] = (int*)malloc(N*count_size*sizeof(int));
		}

		printf("Generate %d number\n______________________\n", N*count_size);
		Generate(mat1,count_size);
		Generate(mat2,count_size);
		for (i=0; i<N*count_size; i++)
			for (j=0; j<N*count_size; j++)
				ItogMat[i][j]=0;	

		Log = (FILE *)fopen("Memory.txt", "a+");
		fprintf(Log, "\n%i\t",N*count_size);
		fclose(Log);	
		do {
			switch(count) {
				case 0:
					printf("Start %d number for %s\n______________________\n", N*count_size,posl);
					time_start = omp_get_wtime();
					for(i=0;i<N*count_size; i++)
						matr(mat1,mat2,ItogMat,count_size);
					time_finish = omp_get_wtime();
					break;
				case 1: 
					printf("Start %d number for %s\n______________________\n", N*count_size,two_th);
					omp_set_num_threads(2);
					time_start = omp_get_wtime();
					#pragma omp parallel sections 
					{
						#pragma omp section
							for(i=0;i<(N*count_size)/2; i++)
	 							matr(mat1,mat2,ItogMat,count_size);
						#pragma omp section
							for(i= N / 2 ;i < N*count_size; i++)
								matr(mat1,mat2,ItogMat,count_size);
					}
					time_finish = omp_get_wtime();
					break;
				case 2:
					printf("Start %d number for %s\n______________________\n", N*count_size,four_th);
					omp_set_num_threads(4);
					time_start = omp_get_wtime();
					#pragma omp parallel sections
					{
						#pragma omp section
							for(i=0;i<(N*count_size)/4; i++)
								matr(mat1,mat2,ItogMat,count_size);
						#pragma omp section
							for(i=(N*count_size)/4; i<(N*count_size)/2; i++)
								matr(mat1,mat2,ItogMat,count_size);
						#pragma omp section
							for(i=(N*count_size)/2;i<((N*count_size)/4)*3; i++)
								matr(mat1,mat2,ItogMat,count_size);
						#pragma omp section
							for(i=((N*count_size)/4)*3;i<(N*count_size); i++)
								matr(mat1,mat2,ItogMat,count_size);
					} 
					time_finish = omp_get_wtime();
					break;			
			}
			printf("Done\n_________________________\n");
			printf("Record in file \n______________________\n");
			Log = (FILE *)fopen("Memory.txt", "a+");
			fprintf(Log, "%lf\t",time_finish-time_start);
			fclose(Log);
			printf("Done \n______________________\n");

			count++;
		}while(count!=3);
		count=0;
		for (i = 0; i < N*count_size; i++) {
			free(mat1[i]);
			free(mat2[i]);
			free(ItogMat[i]);
		}
		free(mat1);
		free(mat2);
		free(ItogMat);
		count_size=count_size*2;
	}while(count_size!=8);
return 0;
}

Последний раз редактировалось Kr@ShAK; 27.03.2015 в 22:35.
Kr@ShAK вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Переполнение при умножении ivan.tiran Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 15.04.2014 20:20
КЭШ-промахи при умножении квадратных матриц (Си) Stasiksis Фриланс 7 11.09.2012 19:25
КЭШ-промахи при умножении квадратных матриц (Си) Stasiksis Помощь студентам 1 15.06.2012 12:09
Переполнение при умножении Flay Общие вопросы C/C++ 6 29.09.2010 21:50
двузначные числа которые при умножении на 3 будут заканчиваться на цифру 4 Ases_51 Паскаль, Turbo Pascal, PascalABC.NET 4 13.01.2008 11:37