Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
4classic4
0 / 0 / 0
Регистрация: 23.01.2014
Сообщений: 21
#1

Динамические массивы и кэш процессора - C++

02.03.2014, 01:32. Просмотров 537. Ответов 6
Метки нет (Все метки)

Добрый вечер! У меня следующий вопрос: ниже представленный код выдает ошибку, как-бы нет доступа к памяти, IDE вижел 2011, главная суть программы, постепенно увеличивать размерность двухмерного массива, пока, пока его объем не станет больше размера кэш 1-го уровня процессора - когда станет больше, и в этот момент мы выходим из цикла и из расчетов размера массива - определяем объем кэш 1-го уровня.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <Windows.h>
#include <stdlib.h>
using namespace std;
int main () {   
    int **array1;
    unsigned int start, stop, time1, time2, i=1;
    
        array1=(int**)malloc(i*sizeof(int));
        for(unsigned int j=0; j<i; j++)
            array1[j]=(int*)malloc(i*sizeof(int));
        do
    {   
        unsigned int mul;
        i++;
        cout<<"bukva i="<<i<<"\n";
        array1=(int**)realloc(array1,i*sizeof(int));
        for(unsigned int j=0; j<i; j++)
            array1[j]=(int*)realloc(array1,i*sizeof(int));
        for(unsigned int j=0; j<i; j++)
            for(unsigned int k=0; k<i; k++)
                array1[j][k]=2;
        
        start=GetTickCount();
            for(int k=0; k<10000; k++)
                mul=array1[0][0]*array1[i-1][i-1];
        stop=GetTickCount();
        cout<<"raznost = "<</*stop<<'-'<<start<<*/'='<<(stop-start)<<'\n';
        if(i%2==0){
            time1=stop-start;
            if(i==2) time2=time1;
        }
        else{
            time2=stop-start;
        }
 
    }
        while(!(time2-time1));
        cout<<'\n'<<(time2-time1)<<'\n'<<(i*i*4/1024)<<" kb";
        system("pause");
        return 0;
}
Добавлено через 1 час 19 минут
Ошибка:
Первый этап обработки исключения по адресу 0x012C891F в Проект1.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00000006.
Необработанное исключение по адресу 0x012C891F в Проект1.exe: 0xC0000005: нарушение прав доступа при записи по адресу 0x00000006.
Программа "[12936] Проект1.exe" завершилась с кодом 0 (0x0).
Я правильно использовал функции realloc(), malloc()?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Убежденный
Системный программист
Эксперт С++
14895 / 6713 / 1059
Регистрация: 02.05.2013
Сообщений: 11,003
Завершенные тесты: 1
02.03.2014, 11:25     Динамические массивы и кэш процессора #2
Этот код - полная ересь. Извините за прямоту.
Размер кэша CPU нельзя определить по разнице между GetTickCount.
Как и нельзя гарантировать средствами C/C++, что объект обязательно
будет размещен в кэше.

А нужная Вам информация по кэшу извлекается инструкцией CPUID процессора.
4classic4
0 / 0 / 0
Регистрация: 23.01.2014
Сообщений: 21
02.03.2014, 12:28  [ТС]     Динамические массивы и кэш процессора #3
Меня в этом коде больше интересует ошибка, почему запрет доступа? Это самое главное для меня.

Добавлено через 27 минут
Вот в этом блоке кода:
C
1
2
3
4
5
6
array1=(int**)realloc(array1,i*sizeof(int));
        for(unsigned int j=0; j<i; j++)
            array1[j]=(int*)realloc(array1,i*sizeof(int));
        for(unsigned int j=0; j<i; j++)
            for(unsigned int k=0; k<i; k++)
                array1[j][k]=2;
Если calloc - то все нормально, но как realloc - ошибка доступа...
zss
Модератор
Эксперт С++
6192 / 5795 / 1877
Регистрация: 18.12.2011
Сообщений: 14,800
Завершенные тесты: 1
02.03.2014, 12:37     Динамические массивы и кэш процессора #4
У вас уже распределена память под строки,
Соответственно перераспределить указатели на них нельзя.
Проще всё сначала поудалять и распределить заново!
Убежденный
Системный программист
Эксперт С++
14895 / 6713 / 1059
Регистрация: 02.05.2013
Сообщений: 11,003
Завершенные тесты: 1
02.03.2014, 12:38     Динамические массивы и кэш процессора #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 4classic4 Посмотреть сообщение
C++
1
2
3
array1=(int**)realloc(array1,i*sizeof(int));
for(unsigned int j=0; j<i; j++)
    array1[j]=(int*)realloc(array1,i*sizeof(int));
Первый realloc перевыделяет память под массив, это понятно.
А вот что делает второй realloc ? Он снова перевыделяет память
под массив и присваивает его новый адрес элементу с индексом j.
Ерунда какая-то, в общем. Запустите код под отладчиком и
посмотрите, что происходит.
Alex5
1017 / 680 / 99
Регистрация: 12.04.2010
Сообщений: 1,716
02.03.2014, 14:21     Динамические массивы и кэш процессора #6
Цитата Сообщение от 4classic4 Посмотреть сообщение
Вот в этом блоке кода:
array1=(int**)realloc(array1,i*sizeof(int));
for(unsigned int j=0; j<i; j++)
array1[j]=(int*)realloc(array1,i*sizeof(int));
for(unsigned int j=0; j<i; j++)
for(unsigned int k=0; k<i; k++)
array1[j][k]=2;
Если calloc - то все нормально, но как realloc - ошибка доступа...
C++
1
2
3
4
5
6
/*Если несколько раз подряд вызвать realloc с одними и теми же параметрами, 
то возвращаемое значение будет одно и то же. 
(Зачем перераспределять память, если ни объект, ни его размер не изменились?)*/
 realloc(array1,i*sizeof(int));
 realloc(array1,i*sizeof(int));
 realloc(array1,i*sizeof(int));
Цитата Сообщение от 4classic4 Посмотреть сообщение
C++
1
2
3
 array1=(int**)realloc(array1,i*sizeof(int));
 for(unsigned int j=0; j<i; j++)
     array1[j]=(int*)realloc(array1,i*sizeof(int));
Результат: все указатели array1, array1[0], array1[1] имеют одинаковое значение.
То есть, array1 == *array1, *array1 == **array1, ...

Цитата Сообщение от 4classic4 Посмотреть сообщение
C++
1
2
3
 for(unsigned int j=0; j<i; j++)
     for(unsigned int k=0; k<i; k++)
         array1[j][k]=2;
Здесь array1[0][0] = 2 означает **array1 = 2.
Теперь и array1[0] становится равным 2 ( потому что, *array1 == **array1 ).

array1[0][1] = 2, то есть *(array1[0] + 1*4) = 2, тут пытаемся выполнить операцию *(2+4) = 2
и получаем: Нарушение прав доступа при записи "0x00000006".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.03.2014, 14:52     Динамические массивы и кэш процессора
Еще ссылки по теме:

Динамические массивы C++
C++ Кэш процессора (__cpuid) C++
C++ Динамические массивы
Динамические массивы C++
Динамические массивы C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17302 / 5550 / 347
Регистрация: 30.03.2009
Сообщений: 15,104
Записей в блоге: 26
02.03.2014, 14:52     Динамические массивы и кэш процессора #7
Согласен с тем, что это ересь, но, тем не менее, ТС что-то пытается экспериментировать, а потому полезно бы почитать ссылку: Замеры скорости работы malloc'а на Windows и Linux

Вкратце смысл такой, что malloc/realloc выделяет динамическую память, не обращаясь при этом к физической памяти. Т.е. если ты обращаешься к самому первому и к самому последнему элементу массива, то реально подкачается в память только две страницы в памяти. А в кэш попадёт всего 2 строки кэша (cache line). Хз какой размер строки на интеле, но оно измеряется величинами типа 256 байт. Т.е. если ты хочешь, чтобы данные были в кэше, нужно залить данными весь массив с интервалом не больше, чем размер строки кэша, потом это дело прочитать и при этом хоть как-то проверить, что в процессе всего этого не произойдёт переключение задач и уход в ОС. В противном случае твоя программа будет измерять неизвестно что
Yandex
Объявления
02.03.2014, 14:52     Динамические массивы и кэш процессора
Ответ Создать тему
Опции темы

Текущее время: 14:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru