bubanoid
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору klimusu Я совершенно не эксперт, и вам здесь дадут гораздо более квалифицированную помощь чем могу предложить я. Но так как сегодня вечер субботы... Распараллеливание. Ищите по этому слову. И побейте меня камнями, если (в силу очевидности моего ответа) вы уже это гуглили и ничего на этот счёт не нашли. Добавлено: Выше я упоминал об очень медленном выполнении такой команды: Код: break(:,2)=EOSHIFT(break(:,2), SHIFT = shift) | команда выполнялась медленно (минуту) только потому, что я в Visual Studio я трассировал эту строку. Если её проскочить, то она выполняется мгновенно. Можно, конечно, было поставить таймер и сравнить скорость выполнения этой функции с моей аналогичной функцией, но лениво. Это не есть критичное место в моей проге влияющее на общую производительность. Потому вопрос об оптимизированности функции EOSHIFT остаётся открытым. Также мне надо было выполнить следующее: Код: cscoef(:,:,2)=EOSHIFT(cscoef(:,:,2), SHIFT = shift, dim=2) | К сожалению, сие не работает для больших массивов. В студии выскакивет ассемблерное окно указывающее на переполнение буфера? стека?. Пробую через промежуточный массив: Код: cscoef2(:,:,2)=EOSHIFT(cscoef(:,:,2), SHIFT = shift, dim=2) ! и это тоже не работает | делаю так: Код: if (shift>0) then ! cscoef(:,1:ndata-shift,2)=cscoef(:,shift+1:ndata,2) ! не работает cscoef2(:,1:ndata-shift,2)=cscoef(:,shift+1:ndata,2) ! работает else cscoef2(:,1-shift:ndata,2)=cscoef(:,1:ndata+shift,2) ! работает endif cscoef=cscoef2 | (это, естественно, не полностью эквивалентно EOSHIFT, но в моём случае этого достаточно.) или так Код: if (shift>0) then do i=1,ndata-shift cscoef(:,i,2)=cscoef(:,i+shift,2) ! работает enddo else do i=ndata,1-shift,-1 cscoef(:,i,2)=cscoef(:,i+shift,2) ! работает enddo endif | Странно всё это. ну да фиг с ним. работает - ну и ладно. | Всего записей: 101 | Зарегистр. 22-11-2007 | Отправлено: 21:22 22-01-2011 | Исправлено: bubanoid, 22:01 22-01-2011 |
|