Jump to content
    

Порекомендуйте какое-нибудь softcore

Вы для Lattice PAR делали? Или оценка по какому-нить Precision? Если PAR не делали, то эту оценку надо выкинуть на свалку.

PAR после Synplify (не Synplify-Pro), все настройки по умолчанию.

Share this post


Link to post
Share on other sites

PAR после Synplify (не Synplify-Pro), все настройки по умолчанию.

Тогда сорри. Просто сам когда-то проходил, что без PAR (isplever) оценки синтезаторов слишком оптимистичны, у синплифи еще более менее, а у Precision просто неадекватны.

Share this post


Link to post
Share on other sites

Написал компилятор и упростил ядро - при большом регистровом файле на памяти развитая система адресации оказалась неэффективной. Новое ядро заметно меньше, и немного быстрее.

В железе пока не пробовал, тестирую в функциональном эмуляторе - скорость эмуляции ~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 by Omen_13

Share this post


Link to post
Share on other sites

Посмотрел такты - при N=13 (ответ 73712) код выполняется за ~200 млн. тактов, те за ~2 сек на Спартане3(~100МГц). Аналогичный код на Delphi(консоль) ~2ГГц x86(AMD) считает

за ~0,04 сек, те в 50 раз быстрее(хотя тактовая больше в ~200 раз).

Share this post


Link to post
Share on other sites

Хотелось-бы посмотреть результаты компиляции(размер кода, листинг, если есть, и такты) для NIOS-2, MicroBlaze(EDK не установлен),и др софт-процессоров, для сравнения. Исходники N-ферзей можно отсюда:

http://electronix.ru/forum/index.php?showt...mp;#entry516828

 

 

На Си давно уже не пишу, не хотелось-бы только для сравнения ставить, разбираться... А Паскаля для софт-процессоров нет.

Edited by Leka

Share this post


Link to post
Share on other sites

Посмотрел такты - при 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 by blackfin

Share this post


Link to post
Share on other sites

Любопытно, для 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 МГц тактовой.

Share this post


Link to post
Share on other sites

Мысли вслух... 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

Наверно, надо подправить типы, чтобы не было операций приведения типов.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...