У меня есть следующий код...
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.
Без дополнительной информации о функции DoProcess, если (i, j, k) результат не меняется все время, два возможных подхода к оптимизации на практике:
Одной из возможностей увеличения скорости является векторизация внутри DOprocess и принятие вектора, по крайней мере, для одного входа.
http://www.mathworks.de/de/help/matlab/matlab_prog/vectorization.html
Такой векторный код выполняется быстрее, потому что накладные расходы для циклов удаляются или существуют только один раз для каждого вектора. Кроме того, многие из основных операций очень эффективны для больших наборов данных и используют многопоточные вычисления. Это не требует параллельной панели инструментов.
Поскольку вы не знаете подробностей о функции DoProcess, невозможно еще больше оптимизировать код.
Если вы каким-то образом реализуете реализацию функции, вы можете развернуть хотя бы один цикл и использовать SIMD-функции (почти каждый процессор поддерживает хотя бы частично).
Если вы хотите, чтобы ваши вычисления заканчивались быстрее, вы можете попробовать добавить больше потоков и посмотреть, помогает ли это.
вы можете объединить их как образец ниже:
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
}
Это не оптимизация алгоритма, но вы можете выполнить этот код параллельно (предполагая, что между итерациями (DOprocess) нет зависимостей.