Не взлетит в ближайшие 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е-компонент под другие языки - нужна лишь поддержка деклараций анонимных функций-замыканий в качестве аргументов функций.
Асинхронное и параллельное это разные вещи. =============== Конечно разные - замысел (параллелизм на уровне алгоритма) и его воплощение (асинхронный запуск и сбор результатов) [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)
OpenCL. Пока нет, пока думаем, хотя время пришло. =============== Конечно пришло :) На распараллеливаемом кодере H.264 на середнячке "AMD R9 290" (2500 шэйдеров) прирост перформанса относительно проца i5 4570 - 8..10 раз.
Поэкспериментируйте сколько нитей в секунду вы можете просто создавать и сразу же завершать? Когда то я экспериментировал, получилось всего 20 тыс в секунду. ================ Нити ради нитей (содержащие только фрэймы вызова) ? Это оторвано от реальности, ИМХО.
===========================
Недолюбливал распараллеливание задач пока не познакомился с инструментом как с ними (асинхронными задачами с требованиями взаимной синхронизации) работать - так назывемые "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)
===============
Конечно разные - замысел (параллелизм на уровне алгоритма) и его воплощение (асинхронный запуск и сбор результатов) [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)
===============
Конечно пришло :) На распараллеливаемом кодере H.264 на середнячке "AMD R9 290" (2500 шэйдеров) прирост перформанса относительно проца i5 4570 - 8..10 раз.
Поэкспериментируйте сколько нитей в секунду вы можете просто создавать и сразу же завершать? Когда то я экспериментировал, получилось всего 20 тыс в секунду.
================
Нити ради нитей (содержащие только фрэймы вызова) ? Это оторвано от реальности, ИМХО.
Reply
Leave a comment