Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
Левиафам
34 / 29 / 11
Регистрация: 31.05.2012
Сообщений: 555
#1

Какой максимальный размер матриц можно задать для перемножения? - C++

24.01.2017, 12:34. Просмотров 407. Ответов 11
Метки нет (Все метки)

Привет кодеры! Тут вопрос такой. Решил я перемножить матрицы и заинтересовался какой максимальный допустимый размер матрицы я могу задать для перемножения. В моем случае размер матриц 8000x8000 уже выдает такую ошибку:

"Unhandled exception at at 0x77A6A832 in максимальный размер матрицы.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x00D3FB24."

На сколько я понял исходя из ошибки мне доступно всего 0x00D3FB24?

Действительно максимальный размер будет составлять не больше 8000 тысяч? Может я что-то не так делаю?

Спасибо за разъяснение заранее.

вот исходник:

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
#include <iostream>  
 
#define N  8000
 
void matrix_multiplication()
{
    double *a, *b, *c;
    int i, j, k;
 
    a = new double[N*N];
    b = new double[N*N];
    c = new double[N*N];
    
    for (int i = 0; i<N; i++)
        for (int j = 0; j<N; j++)
            a[i*N + j] = b[i*N + j] = c[i*N + j] = 0;
 
 
    for (i = 0; i<N; i++) {
        for (j = 0; j<N; j++) {
            for (k = 0; k<N; k++)
                c[i*N + j] += a[i*N + k] * b[k*N + j];
        }
    }
    
}
 
 
void main() {
    matrix_multiplication();
    getchar();
}

http://www.cyberforum.ru/cpp/thread561436.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2017, 12:34
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Какой максимальный размер матриц можно задать для перемножения? (C++):

Какой приблизительно размер добавляемого компонента и влияет ли он на размер самой программы
Здравствуйте, меня интересует вопрос, когда создаешь какой нить компонент,...

Написать алгоритм для перемножения скобок вида (4-А)* (3-А)
Нужно написать алгоритм для перемножения скобок вида (4-А)*(3-А). Причем таких...

Как задать размер и позицию прямоугольника
Здравствуйте. Пытаюсь разобраться, как задать размер и позицию прямоугольника,...

Какой максимальный размер строки можно зашифровать?
Хочу зашифровать текст с помощью cryptopp, но у меня получается зашифровать...

Какой максимальный размер двумерного массива можно создать?
Ребят возник вопрос. Самый большой тип знаковый- это __int64. Там максимальный...

11
likehood
930 / 789 / 378
Регистрация: 25.12.2016
Сообщений: 2,627
Завершенные тесты: 3
24.01.2017, 14:24 #2
Левиафам, можно немного увеличить размер матриц, если выделять память не сплошным куском, а по строкам:
C++
1
2
3
4
double **m = new double*[n];
for (size_t i=0; i<n; i++) {
    m[i] = new double[n];
}
Мне удалось таким образом выделить память под три матрицы 9300x9300. Если перевести это в гигабайты, то получится почти 2 Гб.
1
Левиафам
34 / 29 / 11
Регистрация: 31.05.2012
Сообщений: 555
24.01.2017, 14:46  [ТС] #3
Цитата Сообщение от likehood Посмотреть сообщение
можно немного увеличить размер матриц, если выделять память не сплошным куском, а по строкам
типа по кусочкам разместить в памяти?

А почему 2 гига?


(9300x9300)+ (9300x9300)+ (9300x9300) = 259 470 000 значений

одно значение весит 4 байта(на моем компе), тогда 259 470 000 значений = 1 037 880 000 байт = 0,97 гигабайт

или может я что-то не так насчитал
0
likehood
930 / 789 / 378
Регистрация: 25.12.2016
Сообщений: 2,627
Завершенные тесты: 3
24.01.2017, 14:50 #4
Цитата Сообщение от Левиафам Посмотреть сообщение
одно значение весит 4 байта(на моем компе)
sizeof(double) == 8

Добавлено через 50 секунд
Цитата Сообщение от Левиафам Посмотреть сообщение
типа по кусочкам разместить в памяти?
Да. Одна строка - один непрерывный блок.

Добавлено через 1 минуту
P.S. тип double не зря так называется - потому что он в два раза больше чем четырёхбайтовый float.
1
Левиафам
34 / 29 / 11
Регистрация: 31.05.2012
Сообщений: 555
24.01.2017, 14:53  [ТС] #5
странно что у меня 8 гигабайт памяти, и у меня всего почти 1,20 гигайбайт выделилось для этого. Почему так? Почему больше нельзя. А когда я делаю перемножение на видеокарте у которой 2 гигабайта памяти (cuda) то у меня спокойно перемножаются матрицы размером 10000x10000 ......

Добавлено через 2 минуты
likehood, спасибо за поправку. Я знаю что тип double 8 байт(опять же на моей машине) просто не обратил внимание на тип думая что у меня Int (я этот пример выдрал из своего "хлама" и не посмотрел внимательно)
0
likehood
930 / 789 / 378
Регистрация: 25.12.2016
Сообщений: 2,627
Завершенные тесты: 3
24.01.2017, 14:57 #6
Цитата Сообщение от Левиафам Посмотреть сообщение
Почему больше нельзя.
Честно сказать, готового ответа у меня нет. Возможно, отвечу позднее. А сейчас мне нужно идти.
0
Левиафам
34 / 29 / 11
Регистрация: 31.05.2012
Сообщений: 555
24.01.2017, 14:59  [ТС] #7
likehood, спасибо бро! ты тогда потом приходи может разберемся))) спасибо тебе
0
CheshireCat
Эксперт С++
2907 / 1256 / 114
Регистрация: 27.05.2008
Сообщений: 3,451
24.01.2017, 15:40 #8
Левиафам, а какая у тебя разрядность системы (32/64) и какова настройка компилятора - генерирует ли он 32-битный или 64-битный код?
В обычном случае в 32-битном коде пользователю доступны несколько менее 2 Гб, причем в эту величину должно влезть все - код программы, статические данные, стек и "куча" (твоя динамическая матрица). Так что гиг с хвостиком на матрицу выглядит довольно правдоподобно.
1
Левиафам
34 / 29 / 11
Регистрация: 31.05.2012
Сообщений: 555
24.01.2017, 16:00  [ТС] #9
CheshireCat, у меня 64 битная ось. Программирую в visual studio 2012. создавал обычный консольныйпроект. Правда не знаю как посмотреть какой именно код генерит 32 или 64.

Цитата Сообщение от CheshireCat Посмотреть сообщение
доступны несколько менее 2 Гб
а где это написано? Есть где это можно прочитать? Получается даже не зависимо от матрицы в целом размер программы не должен превышать 2 гигабайта в 32 битной версии?? а как же игры компьютерные, они же бывают даже больше весят и сишного кода там наверно более двух гигов. Я коненчо не знаток, просто хочу разобраться.

Добавлено через 4 минуты
допустим у меня код генерится в 32 бита, то можно предположить что для 64 бита я могу задавать размер примерно 15 тысяч
0
CheshireCat
Эксперт С++
2907 / 1256 / 114
Регистрация: 27.05.2008
Сообщений: 3,451
24.01.2017, 16:06 #10
Прочитать можно, например, у мэтра Джеффри Рихтера в его "Windows для профессионалов". Есть в электронном виде в Сети, гугель в помощь.
1
Левиафам
34 / 29 / 11
Регистрация: 31.05.2012
Сообщений: 555
24.01.2017, 17:17  [ТС] #11
CheshireCat, спасибо. А как посмотреть в какой код генерирует?

Добавлено через 7 минут
уже разобрался. сверху на панели можно выбрать. Правда в моем случае нужно было самому создать и добавить

Добавлено через 53 минуты
CheshireCat, А Рихтер говорил что именно на винде такой размер дозволен? Ну зависит от операционной системы? А что если у меня вообще 1 гиг памяти?
0
GbaLog-
Любитель чаепитий
3156 / 1462 / 462
Регистрация: 24.08.2014
Сообщений: 5,179
Записей в блоге: 1
Завершенные тесты: 2
25.01.2017, 17:41 #12
Цитата Сообщение от likehood Посмотреть сообщение
sizeof(double) == 8
Зависит от платформы.
0
25.01.2017, 17:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2017, 17:41
Привет! Вот еще темы с решениями:

Алгоритм Штрассена для быстрого перемножения матриц
Помогите реализовать алгоритм Штрассена! Может у кого нибудь есть исходник на...

Какой максимальный размер видеокарты можно поставить на ASRock AM2NF6G-VSTA?
Какой максимальный размер видеокарты можно поставить на такую мамку ASRock...

Функция перемножения матриц, с классом для выражения матриц
Вот поставленная задача: Написать функцию, которая будет вычислять...

Можно ли задать размер картинки для закрытия модального окна?
Для закрытия модального окна используется вот такой типовой код:...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru