Какие-нибудь быстрые алгоритмы поиска для вложенных циклов?

0

У меня есть следующий код...

for i=1:100
   for j=1:200

       for k=1:100

             error = DOprocess(i,j,k);

             if(error==const)
               %%Break all loops...
             end
       end

  end
end

Теперь проблема заключается в том, что функция DoProcess занимает много времени для каждого запуска. Но я хочу найти комбинацию I, j, k, для которой код ошибки равен const. Также я не знаю внутренней логики DoProcess. Я знаю, что если я знаю, что могу использовать методы оптимизации, чтобы найти оптимальное решение. Также DoProcess может возвращать ошибку, которая равна const для нескольких комбинаций I, j и k. Мне нужно найти только первое событие. Так может ли кто-нибудь предложить мне альтернативный алгоритм поиска вместо этих циклов. Код находится в Matlab, но для c/c++ ребята все, что вам нужно, заменяют end на} и сохраняют {в начале каждого цикла. Я готов реализовать алгоритмы поиска, если это необходимо в Matlab.

  • 1
    Купите 100 * 100 * 200 процессоров и делайте это параллельно.
  • 0
    С информацией, которую вы предоставили, я сомневаюсь, что был бы лучший способ сделать это. В худшем случае вам, возможно, придется просмотреть все возможные комбинации.
Показать ещё 5 комментариев
Теги:
algorithm

5 ответов

0
Лучший ответ

Без дополнительной информации о функции DoProcess, если (i, j, k) результат не меняется все время, два возможных подхода к оптимизации на практике:

  1. сделайте это в автономном режиме и ожидайте кеширования (i, j, k)
  2. или, сделайте это один раз в онлайн-среде и в кеше. избегать дублирования расчета.
0

Одной из возможностей увеличения скорости является векторизация внутри DOprocess и принятие вектора, по крайней мере, для одного входа.

http://www.mathworks.de/de/help/matlab/matlab_prog/vectorization.html

Такой векторный код выполняется быстрее, потому что накладные расходы для циклов удаляются или существуют только один раз для каждого вектора. Кроме того, многие из основных операций очень эффективны для больших наборов данных и используют многопоточные вычисления. Это не требует параллельной панели инструментов.

0

Поскольку вы не знаете подробностей о функции DoProcess, невозможно еще больше оптимизировать код.

Если вы каким-то образом реализуете реализацию функции, вы можете развернуть хотя бы один цикл и использовать SIMD-функции (почти каждый процессор поддерживает хотя бы частично).

Если вы хотите, чтобы ваши вычисления заканчивались быстрее, вы можете попробовать добавить больше потоков и посмотреть, помогает ли это.

0

вы можете объединить их как образец ниже:

    max = 100*200*100;
    for (n = 0:max) {
        temp = n;
        i = temp % 100+1;
        temp/=100;
        j = temp % 200+1;
        temp/=200;
        k = temp % 100+1;

        error = DOprocess(i,j,k);

        if(error==const)
            break;
        end
    }
  • 2
    Я не думаю, что это вызовет ускорение, а скорее наоборот, со всеми этими операциями по модулю и делению ...
  • 0
    Он не будет ускоряться, однако он может избежать многих вложенных циклов for и лучше управляться, если есть какой-либо рефакторинг кода.
Показать ещё 2 комментария
0

Это не оптимизация алгоритма, но вы можете выполнить этот код параллельно (предполагая, что между итерациями (DOprocess) нет зависимостей.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню