Leave a comment

ext_3336107 October 15 2015, 19:16:25 UTC
Не взлетит в ближайшие 30 лет, так программирование отлично от эмпирического, а у людей даже от распараллеливания на OpenCL подгорает.
===========================
Недолюбливал распараллеливание задач пока не познакомился с инструментом как с ними (асинхронными задачами с требованиями взаимной синхронизации) работать - так назывемые "Promise", вот куски кода из последнего проекта (JS+AJAX):

return promise.joinReturning([ // данные AJAX-функции (запосы к БД) запускаются параллельно
getRegionsArr(OPERDAY4_ARR['date'], dgRegionsArr, {}),
getDistrictsArr(OPERDAY4_ARR['date'], dgDistrictsArr, {}),
getOfficesArr(OPERDAY4_ARR['date'], dgOfficesArr, {}),
getCompaniesArr(OPERDAY4_ARR['date'], dgCompaniesArr, {}),
getCatalogsArr(OPERDAY4_ARR['date'], dgCatalogsArr, {}),
getSsServicesArr(OPERDAY4_ARR['date'], dgSsServicesArr, {}),
getSsPeriodsArr(OPERDAY4_ARR['date'],dgSsPeriodsArr,{}),
getSsPublishersArr(OPERDAY4_ARR['date'],dgSsPublishersArr,{})
]).then(function (res) { // дожидаемся когда отработает последняя из них
dgRegionsArr = res[0][1]['dg']; //res[0] - результат 1-й функции
if (dgRegionsArr[1]) REGIONS_ARR = res[0][1]['val'];
...
dgSsPublishersArr = res[7][1]['dg']; //res[0] - результат последней функции
if (dgSsPublishersArr[1]) SS_PUBLISHERS_ARR = res[7][1]['val'];
return promise.wrap(null); // возврат обещания-заглушки
});

----------------------------------------
return promise.chain([ // данные асинхронные функции запукаются каждая ожидая возврата из предыдущей
function() {return setSESSION_OperDay4(value,null);},
function(err,res){ // value = сведения по выбранному дню
OPERDAY4_ARR = res; // из PHP: сведения по выбранному дню
// освежаем глобальные дата-зависимые массивы и перезаполняем глобальные списки
return getOperDay4Deps(OPERDAY4_ARR['date']);
},
function(err,res/*results*//*17sep2015*/){
return promise.wrap(function() {
if (init) {
if (workareas[current_wa].onInit && workareas[current_wa].initAt && (workareas[current_wa].initAt == INIT_AT.OPER_DAY4)) {
workareas[current_wa].onInit(STAGE.INIT);
}
} else { // чтобы не продублирвать "onInit" - первыбрать и снхронизирвоать пол ввода на текущей робочей области
if (workareas[current_wa].onOperDay4Changed && isOperDay4Changed()) {
//workareas[current_wa].onOperDay4Changed(isOperDay4Changed());
workareas[current_wa].onOperDay4Changed();
}
}
return true;
});
} ,
function(err,res){
// список областей
// return promise.wrap(function() { /*17sep2015*/
loadCBox("region4",REGIONS_ARR, SORT.DATAA0,init || dgRegionsArr[1] || isOperDay4Changed(),init ? REGION_ARR['code'] : gebid("region4").value,null);
StoreOperDay4Changed();
return region4Changed(gebid("region4").value,init); // по цепочке загружает списки районов (и далее ОС), возвращает true
// }); /*17sep2015*/
}
]);

-------------------

Ничто не мешает написать Promisе-компонент под другие языки - нужна лишь поддержка деклараций анонимных функций-замыканий в качестве аргументов функций.

Reply

(The comment has been removed)

ext_3336107 October 15 2015, 22:12:38 UTC
Асинхронное и параллельное это разные вещи.
===============
Конечно разные - замысел (параллелизм на уровне алгоритма) и его воплощение (асинхронный запуск и сбор результатов) [IMHO]
Тупо облегчение программирования в духе :

promise.joinReturning([
parallel_func(part1_data), ... parallel_func(part1000_data), // стартуют одновременно
]).then(function(err.result){ // сборка общего результата как только самая медленная закончит
out = result[0].concat(result[1])....concat(result[1000]);
});

ПС: Вы на шэйдерах видеокарт расчеты делаете ? (раз упоминаете OpenCV)

Reply

(The comment has been removed)

ext_3339070 October 16 2015, 13:05:51 UTC
OpenCL. Пока нет, пока думаем, хотя время пришло.
===============
Конечно пришло :) На распараллеливаемом кодере H.264 на середнячке "AMD R9 290" (2500 шэйдеров) прирост перформанса относительно проца i5 4570 - 8..10 раз.

Поэкспериментируйте сколько нитей в секунду вы можете просто создавать и сразу же завершать? Когда то я экспериментировал, получилось всего 20 тыс в секунду.
================
Нити ради нитей (содержащие только фрэймы вызова) ? Это оторвано от реальности, ИМХО.

Reply


Leave a comment

Up