15 / 13 / 4
Регистрация: 16.08.2018
Сообщений: 125
1

Многопоточная оптимизация клеточного автомата

25.12.2019, 11:59. Показов 1052. Ответов 4
Метки нет (Все метки)

Здравствуйте, товарищи программисты.

Я пишу клеточный автомат, и он работает очень медленно. Пока я не трогаю функцию рендеринга, нужно оптимизировать некоторые циклы.

У меня есть вот такой цикл:
C++
1
2
3
4
5
6
                for (int x = 0; x < MAP_SIZE; ++x)
                    for (int y = 0; y < MAP_SIZE; ++y)
                        if (gMap[x][y]) // Проверка на нулевой указатель
                            if(gMap[x][y]->suc == Object::SUC::SUCT) // Костыль, проверка на существование
                                if (gMap[x][y]->getObjectType() == BOT)
                                    bots.push_back(dynamic_cast<Bot*>(gMap[x][y]));
Как его оптимизировать?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2019, 11:59
Ответы с готовыми решениями:

Реализация клеточного автомата
Подскажите, как можно реализовать одномерный клеточный автомат.

Нужны исходники клеточного автомата
Искал и по форуму, и в сети, но именно на VB не нашел рабочий вариант...

Поправить ошибки в коде клеточного автомата
Необходимо реализовать клеточный автомат (код взят из книги) ошибка связана с val - недопустимое...

Как построить граф автомата Мили по уже построенному графу автомата Мура
Подскажите как построить граф автомата Мили по уже построенному графу автомата Мура ...

4
6740 / 4538 / 1840
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
25.12.2019, 12:11 2
Цитата Сообщение от kcalbCube Посмотреть сообщение
Как его оптимизировать?
C++
1
2
3
4
5
6
7
        for (int x = 0; x < MAP_SIZE; ++x)
            for (auto it = gMap[x], end = it + MAP_SIZE; it != end; ++it)
            {
                auto *bot = *it;
                if (bot && bot->suc == Object::SUC::SUCT && bot->getObjectType() == BOT)
                    bots.push_back(dynamic_cast<Bot*>(bot));
            }
Добавлено через 50 секунд
Цитата Сообщение от kcalbCube Посмотреть сообщение
Я рад твоему горю что заставило тебя написать "---".
Накосячил в коде. Убрал, пока исправлял
1
3063 / 1670 / 578
Регистрация: 23.09.2014
Сообщений: 5,199
25.12.2019, 12:11 3
Цитата Сообщение от kcalbCube Посмотреть сообщение
bots.push_back
на вскидку:
1. можно заюзать omp.h
2. выкинуть push_back
3. подсчитать сначала кол-во актуальных ботов.
4. сделать resize вектора.
5. сложить в этот вектор всех ботов в распараллеленном цикле.
0
6740 / 4538 / 1840
Регистрация: 07.05.2019
Сообщений: 13,725
Записей в блоге: 1
25.12.2019, 12:34 4
Лучший ответ Сообщение было отмечено kcalbCube как решение

Решение

Цитата Сообщение от kcalbCube Посмотреть сообщение
У меня есть вот такой цикл:
Если gMap объявлен как gMap[MAP_SIZE][MAP_SIZE], то распараллелить его можно как-то так
C++
1
2
3
4
5
6
7
8
9
        std::mutex mx;
        std::for_each(std::execution::par, gMap[0], gMap[0] + MAP_SIZE * MAP_SIZE, [&mx, &bots](auto bot)
        {
            if (bot && bot->suc == Object::SUC::SUCT && bot->getObjectType() == BOT)
            {
                std::lock_guard lock(mx);
                bots.push_back(dynamic_cast<Bot*>(bot));
            }
        });
1
884 / 340 / 78
Регистрация: 17.05.2015
Сообщений: 1,096
25.12.2019, 12:34 5
Цитата Сообщение от kcalbCube Посмотреть сообщение
У меня есть вот такой цикл:
Цитата Сообщение от kcalbCube Посмотреть сообщение
Как его оптимизировать?
Можно вообще выкинуть весь цикл целиком, если избавиться от необходимости использовать dynamic_cast

Цитата Сообщение от kcalbCube Посмотреть сообщение
bots.push_back(dynamic_cast<Bot*>(gMap[x][y]));
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.12.2019, 12:34

Типы оптимизация: черная оптимизация, серая оптимизация и белая оптимизация
Много много лет назад, на заре становления профессии &quot;оптимизатора&quot; в какой то умной книжке был...

Подскажите, пожалуйста, как сделать матрицу в виде клеточного листа в builder c ?
Доброго времени суток. Кто знает, подскажите как сделать матрицу, или рисунок в виде клеточного...

Сделать сетку клеточного поля, создать поле и разбить его на маленькие квадраты
возник вопрос:как сделать сетку клеточного поля? создать поле и разбить его на маленькие квадраты....

Оптимизация методом Ньютона (нахождение точки минимума). Оптимизация кода
MATLAB только начал осваивать. Попытался реализовать нахождение точки минимума методом Ньютона...


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

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

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