Вверх ↑
Этот топик читают: Гость
Ответов: 8928
Рейтинг: 823
#1: 2008-11-15 12:37:47 ЛС | профиль | цитата
Вот схемка: code_10666.txt - не обманывает-ли меня слишком умный компилятор (года два назад я на этом прокололся, хорошо Galkov вовремя направил на путь истинный), не выполняя циклы полностью, вызывает сомнение сложение за 2-4 тика, да и умножение за 30 тиков, а ведь ещё выполнение самих циклов!
карма: 19

0
файлы: 1code_10666.txt [2.4KB] [240]
Разработчик
Ответов: 26163
Рейтинг: 2127
#2: 2008-11-15 12:42:56 ЛС | профиль | цитата
Леонид, у меня:
Delphi -- умножение - 7, сложение - 3
FPC -- умножение - 9, сложение - 9
карма: 22

0
Ответов: 8928
Рейтинг: 823
#3: 2008-11-15 13:31:40 ЛС | профиль | цитата
nesco, а подтвердить: "Да, программа выполняет все 100 000 000 умножений и сложений." - можете?
карма: 19

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#4: 2008-11-15 13:46:56 ЛС | профиль | цитата
Леонид писал(а):
а подтвердить:

Не понял

------------ Дoбавленo:


Вот здесь, вроде, показывает, что отрабатывает все i=10000 и j=10000



Add(MainForm,1742357,168,231)
{
Left=20
Top=105
Width=485
Height=311
Caption="Тест скорости"
}
Add(InlineCode,510788,224,287)
{
WorkPoints=#6:doCalc|
EventPoints=#7:onVihod|
DataPoints=#6:Data_a|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|29:uses kol,Share,Windows,Debug;|0:|4:type|28: THiAsmClass = class(TDebug)|10: private|33: C:Array[0..100000] of double;|9: public|21: Data_a:THI_Event;|22: onVihod:THI_Event;|50: procedure doCalc(var _Data:TData; Index:word);|5: end;|0:|14:implementation|29:procedure THiAsmClass.doCalc;|56:var a,i,j,g:integer; |13: d:double;|16: b,e,f:int64;|5:begin|37: a := ReadInteger(_Data,Data_a,0);|9: g:=0;|33: QueryPerformanceFrequency(f);|24: f:=round(f/1000000);|4: |31: QueryPerformanceCounter(b);|57: for i:=1 to a do for j:=1 to a do C[j] := pi * j * i;|35: QueryPerformanceCounter(e); |166: _hi_OnEvent(onVihod, ('Умнож. в память'+';'+Int2Str(round((e-b)/f))+';'+Double2Str((e-b)/f/a/a)+';'+Int2Str(round((e-b)/a/a)))+';'+Int2Str(i-1)+'*'+Int2Str(j-1));|2: |31: QueryPerformanceCounter(b);|53: for i:=1 to a do for j:=1 to a do g := g + j + i;|35: QueryPerformanceCounter(e); |159: _hi_OnEvent(onVihod, ('Сложение'+';'+Int2Str(round((e-b)/f))+';'+Double2Str((e-b)/f/a/a)+';'+Int2Str(round((e-b)/a/a)))+';'+Int2Str(i-1)+'*'+Int2Str(j-1));|7: |0:|4:end;|4:end.|
link(onVihod,13424301:doAdd,[])
link(Data_a,12779124:Text,[])
}
Add(Button,13864568,168,287)
{
Left=55
Top=15
Width=70
Caption="Вычислить"
link(onClick,510788:doCalc,[])
}
Add(StringTable,13424301,280,287)
{
Left=10
Top=50
Width=460
Height=220
Columns=#16:Тип действия=120|14:Время мксек=80|13:Цикл мксек=80|11:Цикл Тик=80|11:Итераций=80|
Grid=0
}
Add(Edit,12779124,224,238)
{
Left=135
Top=15
Text="10000"
DataType=2
link(onChange,3092606:doCompare,[])
}
Add(If_else,3092606,266,238)
{
Type=3
Op2=Integer(100000)
link(onTrue,3117955:doValue,[])
link(onFalse,3117955:doClear,[])
}
Add(Memory,3117955,315,238)
{
Default=Integer(100000)
link(onData,4082044:doEvent1,[])
}
Add(Edit,16679945,504,245)
{
Left=200
Top=15
Width=125
Color=12639424
Text="100000000 циклов"
ReadOnly=0
}
Add(MathParse,14360575,406,245)
{
DataCount=1
MathStr="%1 * %1"
link(onResult,8836980:doStrCat,[])
}
Add(Hub,4082044,357,238)
{
link(onEvent1,12779124:doText2,[(397,244)(397,225)(212,225)(212,251)])
link(onEvent2,14360575:doCalc,[])
}
Add(StrCat,8836980,455,245)
{
Str2=" циклов"
link(onStrCat,16679945:doText,[])
}

карма: 22

0
Ответов: 8928
Рейтинг: 823
#5: 2008-11-15 14:12:26 ЛС | профиль | цитата
nesco, а если вот: code_10670.txt - интерации выполняются, а вычисления нет ?
карма: 19

0
файлы: 1code_10670.txt [1.3KB] [200]
Разработчик
Ответов: 26163
Рейтинг: 2127
#6: 2008-11-15 14:36:41 ЛС | профиль | цитата
Леонид писал(а):
а вычисления нет ?

Вычисления чего, тиков что ли У меня 1 показывает и 100 000 000 итераций
карма: 22

0
Ответов: 8928
Рейтинг: 823
#7: 2008-11-15 15:23:30 ЛС | профиль | цитата
nesco, вычисления в теле цикла; я, конечно, не знаю архитектуры P-IY, но меня смущает, как можно за столь малое количество машинных тактов произвести умножение двух чисел, да ещё и проверить окончание цикла, ведь надо и адреса выставить, и прочитать, и из регистра в регистр перебросить.... Такое же умножение (сложение) в VBA на Excel занимает по 200 тиков на цикл на этой же машине.
карма: 19

0
Ответов: 1161
Рейтинг: 160
#8: 2008-11-15 16:47:48 ЛС | профиль | цитата
nesco писал(а):
Delphi -- умножение - 7, сложение - 3
FPC -- умножение - 9, сложение - 9

объяните пожалуйста, что значат эти цифры?
карма: 0

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#9: 2008-11-15 17:36:43 ЛС | профиль | цитата
Вообще-то, должен показвать количество тиков счетчика производительности, но я глянул код, там показывает в usec
карма: 22

0
Ответов: 8928
Рейтинг: 823
#10: 2008-11-15 19:41:48 ЛС | профиль | цитата
nesco, ну что же, такая производительность меня бы устроила , но мне надо передать эти 10 000 000-100 000 000 цифр/сек (3-х или 4-х байтных) внутрь компьютера с внешнего устройства, можно-ли это сделать?
LainX, эти цифры - длительность цикла умножения (сложения) в тиках, что бы получить в секундах, надо разделить на частоту процессора.
карма: 19

0
Ответов: 5227
Рейтинг: 587
#11: 2008-11-15 19:59:15 ЛС | профиль | цитата
Леонид, мне тоже это интересно. Но скорей всего без специальных дров ловить не чего
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26163
Рейтинг: 2127
#12: 2008-11-15 20:26:58 ЛС | профиль | цитата
Леонид писал(а):
эти цифры - длительность цикла умножения (сложения) в тиках, что бы получить в секундах, надо разделить на частоту процессора

В коде это уже сделано


    QueryPerformanceFrequency(f); // вычисление частоты
f:=round(f/1000000);

QueryPerformanceCounter(b); // определение стартового количества тиков
for i:=1 to a do for j:=1 to a do C[j] := pi * j * i;
QueryPerformanceCounter(e); // определение конечного количества тиков

_hi_OnEvent(onVihod, ('Умнож. в память'+';'+
Int2Str(round((e-b)/f))+ // отображение usec -- (e-b)/f
';'+Double2Str((e-b)/f/a/a)+';'+Int2Str(round((e-b)/a/a)))+';'+Int2Str(i-1)+'*'+Int2Str(j-1));

Так что, Леонид, оно у тебя в usec меряет
карма: 22

0
Ответов: 8928
Рейтинг: 823
#13: 2008-11-15 20:46:07 ЛС | профиль | цитата
LainX, usec - микросекунды

nesco, а что насчёт "передать эти 10 000 000-100 000 000 цифр/сек (3-х или 4-х байтных) внутрь компьютера с внешнего устройства", ну скажем по другому: я физически могу сделать платку вырабатывающую по одному 32-битному слову (цифре) в каждые 10-100 наносекунд, вставляемую в один из разъёмов на материнской плате, но не могу сделать *.dll, которая передала бы этот поток в схему HiAsm, но полагаю, что nesco это сделать может, или я ошибаюсь
карма: 19

0
Разработчик
Ответов: 26163
Рейтинг: 2127
#14: 2008-11-15 21:03:48 ЛС | профиль | цитата
Леонид писал(а):
вставляемую в один из разъёмов на материнской плате, но не могу сделать *.dll

Мне кажется, тут драйвер устройства нужен, а не *.dll.
А писать драйвер устройства без устройства, может tsdima сможет, но что-то меня бьют сильные сомнения...
карма: 22

0
Ответов: 2125
Рейтинг: 159
#15: 2008-11-15 21:26:50 ЛС | профиль | цитата
400Мб/сек? Без буферизации под виндой не получится. Платка должна иметь свой буфер, при таких скоростях хотя бы полмегабайта, либо использовать ПДП.
В любом случае: либо свой драйвер нужен, либо использовать существующий интерфейс (IEEE, SATA, ATA/IDE на худой конец, и т.п.)
------------ Дoбавленo:

nesco писал(а):
может tsdima сможет

У меня и DDK-то нету, а ты говоришь
карма: 1

1
Голосовали:Konst
Сообщение
...
Прикрепленные файлы
(файлы не залиты)