Leka 1 May 25, 2009 Posted May 25, 2009 · Report post Вы для Lattice PAR делали? Или оценка по какому-нить Precision? Если PAR не делали, то эту оценку надо выкинуть на свалку. PAR после Synplify (не Synplify-Pro), все настройки по умолчанию. Quote Share this post Link to post Share on other sites More sharing options...
SM 15 May 25, 2009 Posted May 25, 2009 · Report post PAR после Synplify (не Synplify-Pro), все настройки по умолчанию. Тогда сорри. Просто сам когда-то проходил, что без PAR (isplever) оценки синтезаторов слишком оптимистичны, у синплифи еще более менее, а у Precision просто неадекватны. Quote Share this post Link to post Share on other sites More sharing options...
Leka 1 June 10, 2009 Posted June 10, 2009 (edited) · Report post Написал компилятор и упростил ядро - при большом регистровом файле на памяти развитая система адресации оказалась неэффективной. Новое ядро заметно меньше, и немного быстрее. В железе пока не пробовал, тестирую в функциональном эмуляторе - скорость эмуляции ~2 МГц тактовой, можно и большие/сложные программы гонять. N-ферзей компилируется в ~100 слов (код + данные без учета 80 слов, занимаемых массивами), исполняется без ошибок (в эмуляторе). :) module queens N, N2, count, poss, place, val, pos, pos1, i, j arow:20, aleft:20, aright:20, aposs:20 begin for N:=1 to 16 count := 0 j := 1 for i := 1 to N j := j * 2 end val := j - 1 pos := 1 arow[1] := 0 aleft[1] := 0 aright[1] := 0 j := val N2 := N / 2 for i := 1 to N2 j := j / 2 end aposs[1] := j poss := aposs[1] while pos <> 0 if poss <> 0 place := poss & - poss poss := poss & ~ place if pos == 1 and poss == 0 and N & 1 <> 0 count := count * 2 end if pos <> N pos1 := pos + 1 aposs[pos] := poss arow[pos1] := arow[pos] | place aleft[pos1] := (aleft[pos] | place) * 2 aright[pos1] := (aright[pos] | place) / 2 poss := ~ (arow[pos1] | aleft[pos1] | aright[pos1]) & val pos := pos1 else count := count + 1 end else pos := pos - 1 poss := aposs[pos] end end if (N & 1) == 0 count := count * 2 end out := count //вывод результата в порт end end ~Исходник на Си: http://electronix.ru/forum/index.php?showt...st&p=516828 Edited June 20, 2009 by Omen_13 Quote Share this post Link to post Share on other sites More sharing options...
Leka 1 June 10, 2009 Posted June 10, 2009 · Report post Посмотрел такты - при N=13 (ответ 73712) код выполняется за ~200 млн. тактов, те за ~2 сек на Спартане3(~100МГц). Аналогичный код на Delphi(консоль) ~2ГГц x86(AMD) считает за ~0,04 сек, те в 50 раз быстрее(хотя тактовая больше в ~200 раз). Quote Share this post Link to post Share on other sites More sharing options...
Leka 1 June 10, 2009 Posted June 10, 2009 · Report post хотя тактовая больше в ~200 раз Sorry, в ~20 раз (2ГГц vs 100МГц). Quote Share this post Link to post Share on other sites More sharing options...
Leka 1 June 15, 2009 Posted June 15, 2009 (edited) · Report post Хотелось-бы посмотреть результаты компиляции(размер кода, листинг, если есть, и такты) для NIOS-2, MicroBlaze(EDK не установлен),и др софт-процессоров, для сравнения. Исходники N-ферзей можно отсюда: http://electronix.ru/forum/index.php?showt...mp;#entry516828 На Си давно уже не пишу, не хотелось-бы только для сравнения ставить, разбираться... А Паскаля для софт-процессоров нет. Edited June 15, 2009 by Leka Quote Share this post Link to post Share on other sites More sharing options...
blackfin 81 June 15, 2009 Posted June 15, 2009 (edited) · Report post Посмотрел такты - при N=13 (ответ 73712) код выполняется за ~200 млн. тактов, те за ~2 сек на Спартане3(~100МГц). Аналогичный код на Delphi(консоль) ~2ГГц x86(AMD) считает за ~0,04 сек, те в 50 раз быстрее(хотя тактовая больше в ~200 раз). На BF537-600 при N=13 код выполняется за ~213 млн. тактов, те за ~0,36 сек (CPU_CLOCK = 600МГц). Исходники N-ферзей отсюда: http://electronix.ru/forum/index.php?showt...mp;#entry516828 Edited June 15, 2009 by blackfin Quote Share this post Link to post Share on other sites More sharing options...
Leka 1 June 15, 2009 Posted June 15, 2009 · Report post Любопытно, для N-ферзей пока получается ~одинаковое количество тактов для двух архитектур: 1) BF: 1 такт на инструкцию, и 8 32-разрядных(или 16 16-разрядных) РОН + адресные, индексные, и др специальные регистры. Если не путаю. 2)моя текущая: 2..3 такта на инструкцию: 3 такта на load/store(a:=b, b:=a), 2 такта на все остальные, и 1К 32-разрядных РОН. В среднем для задач с массивами ~2.5 такта/инструкция, те ~40 MIPS для 100 МГц тактовой. Quote Share this post Link to post Share on other sites More sharing options...
Leka 1 June 16, 2009 Posted June 16, 2009 · Report post Мысли вслух... a[ i ] - фактически ((a)+(i)), поэтому a[ i ] эквивалентно i[ a ] (в безтиповом языке), a a[ i ][ j ][ k ] эквивалентно k[ j[ i[ a ] ] ]. Т.е. многомерный массив - частный случай одномерного. Кроме того, k[ j[ i[ a ] ] ] требует меньше инструкций и тактов, чем a[i*n+j*m+k]. На BF537-600 при N=13 код выполняется за ~213 млн. тактов, те за ~0,36 сек (CPU_CLOCK = 600МГц). Исходники N-ферзей отсюда: http://electronix.ru/forum/index.php?showt...mp;#entry516828 Наверно, надо подправить типы, чтобы не было операций приведения типов. Quote Share this post Link to post Share on other sites More sharing options...