LINUX.ORG.RU

Открытие виртуального файла

 ,


0

1

Доброго здоровьица, суть беды: функция открывает(fopen) файл /proc/meminfo и выводит значение, после чего закрывает(fclose).В течение всей работы вызовы функции в разных частях кода дают неизменное значение памяти, чего быть не может.

Ответ на: комментарий от Pinkbyte

не бейте, на скорую руку

#include <stdio.h>
#include <stdlib.h>


void memcheck(void){
FILE *file=	fopen( "/proc/meminfo", "rt"); 
	char mem[124]="-1\0";
	


	fgets(mem, 128, file);
	fgets(mem, 128, file);
	fgets(mem, 128, file);
	fgets(mem, 128, file);
	fgets(mem, 128, file);
	printf("%s\n",mem);
	fclose(file);	
	file=NULL;
} 
void input(int N, double **a, double **b, double **c)
{
		for (int j=0; j<N; j++) {
	
	printf("Put first matrix %d string:\n",j);
	for (int i=0; i<N; i++)
	scanf("%f",&a[j][i]);
	printf("Put second matrix %d string:\n",j);
	for (int i=0; i<N; i++)
	scanf("%f",&b[j][i]);
	}
	


}

int cross_ijk(int N, double **a, double **b, double **c)

{
	for (int i=0; i<N; i++) {
		for (int j=0; j<N; j++) {
			double sum= 0.0;
			for( int k=0; k<N; k++)
			sum +=a[i][k] * b[k][j];
			c[i][j]=sum;
			memcheck();
		}
	}
	
return 0;
}

int cross_ikj(int N, double **a, double **b, double **c)
{
	for (int i=0; i<N; i++) {
		for (int k=0; k<N; k++) {
			double r= a[i][k];
			for( int j=0; j<N; j++){
			c[i][j] +=r* b[k][j];
			memcheck();
			}
		}
	}
	
return 0;
}
/*int cross_block(int N, double **a, double **b, double **c)
{
	for (int i=0; i<N; i+=b) 
		for (int j=0; j<N; j+=b) 
			for (int k=0; k<N; k+=b) 
				for (int i1=i; i1<i+b; i++) 
					for (int j1=j; j1<j+b; j++) 
						for (int k1=k; k1<k+b; k++){
							c[i1][j1]+=c[i1][k1]*b[k1][j1];
						//memcheck();}
return 0;
}
*/


int main()
{
	double **a, **b, **c;
	int N=0;
	printf("Put matrix size:\n");
	scanf("%d", &N);
	a=(double **)malloc(sizeof(double)*N);
	c=(double **)malloc(sizeof(double)*N);
	b=(double **)malloc(sizeof(double)*N);
	for (int j=0; j<N; j++) {
	a[j]=(double *)malloc(sizeof(double )*(N));
	b[j]=(double *)malloc(sizeof(double )*(N));
	c[j]=(double *)malloc(sizeof(double )*(N));}
	input(N,a,b,c);
	memcheck();
	cross_ijk(N,a,b,c);
	cross_ikj(N,a,b,c);
	//cross_block(N,a,b,c);
	for (int i; i<N; i++) {
	free(a[i]);
	free(b[i]);
	free(c[i]);}
return 0;
}
Nick__Silver ()
Ответ на: комментарий от Nick__Silver

Во-первых, минимальный размер страницы памяти 4 Кб. Во-вторых, если включены hugepages с always(вроде так, про madvise помню, а как второй режим называется - запамятовал), то там размер еще больше и он может быть уже выделен, а malloc просто кидает тебе куски памяти внутри него. В-третьих, почему ты смотришь на Cached(у меня выдается именно он), а не на MemAvailable(который как раз прекрасно меняется на размере матрицы, например, 100)?

Pinkbyte ★★★★★ ()
Ответ на: комментарий от Nick__Silver

Cached это не кеш процессора, а файловый кеш. Это объём оперативной памяти, которая используется для хранения недавно прочитанных с диска файлов. Тебя размер в 300 мегабайт не смутил? Я никогда не видел процессоров с ТАКИМИ объёмами кеша.

график зависимости использования кэша процессора

100% всё время, пока работает, вне зависимости от объёма и того, что ты делаешь. Просто процессор всегда использует весь кеш.

i-rinat ★★★★★ ()
Последнее исправление: i-rinat (всего исправлений: 1)