OberonCore https://forum.oberoncore.ru/ |
|
Виртуальная машина на CP https://forum.oberoncore.ru/viewtopic.php?f=29&t=6400 |
Страница 3 из 3 |
Автор: | vvmtutby [ Пятница, 07 Июнь, 2019 11:00 ] |
Заголовок сообщения: | Re: Виртуальная машина на CP |
ilovb писал(а): Оставлю тут информацию, возможно кому-то пригодится. Если я правильно понял, то разница таки в SSE. И дело не в векторных операциях, а в количестве используемых регистров. Другими словами компилятор BB в данном случае выдает более медленный код не потому что он не оптимизирующий, а потому что не использует доступные ресурсы ЦП (XMM регистры) и делает слишком много обменов с памятью (кэшем). Это гипотеза, но мне мерещится что BB можно ускорить на типовых числодробильных задачах примерно в 2 раза если научить его использовать xmm регистры. Еще можно ускорить переходом на 64 бита (там еще больше регистров, но по сравнению с 32+xmm эффекта много не будет) "Количеством используемых регистров" , в лучшую сторону, отличался: XDS Modula-2/Oberon-2 ( или см. ранее про "Intel C++" ) P.S. ilovb писал(а): Код: LOOP w := ops[ip]; b4 := w MOD 0100H; b3 := w DIV 0100H MOD 0100H; b2 := w DIV 010000H MOD 0100H; b1 := w DIV 01000000H MOD 0100H; CASE b1 OF |Get: reg[b2].Set(mem[b4]); |Set: mem[b4].Set(reg[b2]); |Add: reg[b2].SetReal(reg[b3].Num() + reg[b4].Num()); |Jmp: ip := b4; |Jgt: IF reg[0].Num() > reg[1].Num() THEN ip := b4 END; |End: EXIT; END; INC(ip); END; Пример на Modula-3 : Код: TYPE SymCode = BITS 9 FOR [0..262]; (* symbol code: 0 .. 261 set default: 262 *) Action = BITS 6 FOR [0..32]; (* error: -1 (not stored in table) shift: 1 .. 10 accept: 11 reduce: 12 .. 21 shift&accept: 22 shift&reduce: 23 .. 32 *) StateRef = BITS 5 FOR [0..28]; (* no more: 0 next state: 1..28 *) S = RECORD key: SymCode; action: Action; next: StateRef; END; Код: WITH p=stack.ptr, a=stack.a, v=symbol.value, l=Rules[action].length DO CASE action OF | 12 => VAR w: expr := NIL; p1:expr:=a[p-1].value.value; BEGIN self.paren_expr(w, p1); v:=w; END; . . . | 20 => VAR w: expr := NIL; p1:STRING:=a[p].value.value; BEGIN self.string_expr(w, p1); v:=w; END; | 21 => VAR w: expr := NIL; p1:CHAR_RANGE:=a[p].value.value; BEGIN self.charRange_expr(w, p1); v:=w; END; ELSE <* ASSERT FALSE *> END; FOR i := p - l + 1 TO p DO a[i].value.value.discard(); END; DEC(p, l); curState := a[p].state; END; DebugState("popping to state"); symbol.code := Rules[action].returnCode; skipTokenGets := 2; Аналог механизма Modula-3 'BITS' есть и в ADA. На что можно рассчитывать в языках программирования, "участниках гонки для решения конкретной задачи", из тех "что под рукой", и которые Борис "готов использовать"? |
Страница 3 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |