Вверх ↑
Этот топик читают: Гость
Ответов: 1291
Рейтинг: 47
#1: 2023-05-18 00:02:57 ЛС | профиль | цитата
Не мог бы кто-нибудь набросать пример, использующий 1, 2, 4, и более ядер процессора? А то часто встречаю оговорку что многоядерность имеет смысл лишь при программной поддержке. А как в Хиасм ее реализовать? Я так навскидку понимаю, это нужно в логике программы предусмотреть разделение ресурсоемких процессов на части и каждую часть запускать при помощи элемента Поток, например внутри динамического контейнера. Операционка, обнаружив 2 и более параллельных потока, сама будет их распределять по ядрам или нет и это тоже как-то нужно делать програмно? И как?
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 4628
Рейтинг: 747
#2: 2023-05-18 20:04:41 ЛС | профиль | цитата
Достаточно использовать Поток. Нужно разделить задачу на количество потоков, а также правильно организовывать доступ к общим данным из потоков.
карма: 26

1
Голосовали:Aziz
Ответов: 1291
Рейтинг: 47
#3: 2023-05-18 22:43:54 ЛС | профиль | цитата
Netspirit, а как быть уверенным что эти потоки по ядрам разошлись, а не остались висеть на одном ядре?
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Разработчик
Ответов: 26112
Рейтинг: 2124
#4: 2023-05-19 01:33:25 ЛС | профиль | цитата
Всем привет! Я тут мимо проходил
Aziz писал(а):
а как быть уверенным что эти потоки по ядрам разошлись, а не остались висеть на одном ядре?

Никак. Система сама выбирает свободный процессор, наименее загруженный. Но многократные проверки сего безобразия показали, что если создать количество потоков, равное количеству процессоров, то система равномерно распределит их между процессорами. Использование назначения affinity-маски рабочих процессоров потоку у нас не реализовано, да и не стоит этого делать, КМК. Если почитать комменты вот к этой функции потоков -- https://learn.microsoft.com/ru-ru/windows/win32/api/winbase/nf-winbase-setthreadaffinitymask, то будет понятно почему.

Редактировалось 1 раз(а), последний 2023-05-19 01:36:21
карма: 22

1
Голосовали:Aziz
Ответов: 771
Рейтинг: 168
#5: 2023-05-19 06:28:43 ЛС | профиль | цитата
Aziz писал(а):
Не мог бы кто-нибудь набросать пример, использующий 1, 2, 4, и более ядер процессора? А то часто встречаю оговорку что многоядерность имеет смысл лишь при программной поддержке. А как в Хиасм ее реализовать?

Уже были похожие темы, вот одна из - них https://forum.hiasm.com/topic/67804/0
Всё зависит от задачи, которую ты пытаешься решить. Возможно, там и не нужна многопроцессорность.

Add(MainForm,2953706,63,119)
{
link(onCreate,11693622:doFor,[])
}
Add(For,11693622,126,133)
{
IncludeEnd=1
link(onEvent,1376284:##add,[])
link(End,12546224:CPUCount,[])
}
Add(CPU,12546224,112,77)
{
}
Add(MultiElementEx,1376284,182,133)
{
link(onEvent1,10543714:doString,[])
link(onSleep,7234084:doString,[(221,146)(221,188)])
}
BEGIN_SDK
Add(EditMultiEx,1850388,21,21)
{
WorkCount=#5:##add|
EventCount=#8:onEvent1|7:onSleep|
VarCount=#12:##eventIndex|
Width=356
Height=186
VOffset=49
Point(##add)
Point(##eventIndex)
link(##add,1643928:doEvent1,[])
}
Add(Thread,1252268,133,70)
{
Delay=0
FastStop=0
Point(doDelay)
link(onExec,1376537:doEvent1,[])
}
Add(Sleep,10787438,294,77)
{
Delay=10000000
link(onSleep,1850388:onSleep,[])
}
Add(Hub,1643928,42,70)
{
link(onEvent1,11295868:doOperation,[(67,76)(67,90)])
link(onEvent2,1252268:doStart,[(74,83)(74,76)])
}
Add(Math,11295868,84,84)
{
OpType=2
Op2=100
link(onResult,1252268:doDelay,[])
}
Add(Hub,1376537,252,70)
{
link(onEvent1,1850388:onEvent1,[])
link(onEvent2,10787438:doSleepMks,[])
}
END_SDK
Add(FormatStr,10543714,252,133)
{
DataCount=1
Mask="Start - %1"
link(onFString,16066954:doWork2,[])
link(Str1,3541374:Var1,[(258,124)(237,124)])
}
Add(FormatStr,7234084,252,182)
{
DataCount=1
Mask="Stop - %1"
link(onFString,16066954:doWork3,[(305,188)])
link(Str1,3541374:Var3,[(258,173)])
}
Add(HubEx,16066954,301,133)
{
link(onEvent,8904438:doAdd,[])
}
Add(GetDataEx,3541374,231,168)
{
Angle=3
link(Data,1376284:##eventIndex,[(188,173)])
}
Add(Memo,8904438,336,133)
{
Left=550
Top=160
Align=5
ScrollBars=3
}

Загрузка всех ядер процессора.PNG
карма: 15

0
Ответов: 1291
Рейтинг: 47
#6: 2023-05-19 07:57:16 ЛС | профиль | цитата
nesco, Gunta, спасибо! Все понятно. Просто собрал суперкомп с 36 ядрами и думаю как бы их все использовать - например при обработке видео или нейрообучении.
nesco, привет проходи не мимо почаще) Без тебя тут никак.
nesco писал(а):
равное количеству процессоро
или ему кратное?

Редактировалось 2 раз(а), последний 2023-05-19 08:10:22
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 8910
Рейтинг: 823
#7: 2023-05-19 12:33:32 ЛС | профиль | цитата
nesco, проходя мимо задержитесь здесь. Форум и так, сам по себе, замирает, не ускоряйте его забвение.
карма: 19

1
Голосовали:kamakama
Разработчик
Ответов: 26112
Рейтинг: 2124
#8: 2023-05-19 13:40:40 ЛС | профиль | цитата
Aziz писал(а):
или ему кратное?

Ему кратное будет создавать потоки в тех процессорах, которые уже заняты предыдущими. Это не имеет смысла, проще разбить задачу на куски, а куски разбить на кол-во процессоров. В этом случае, каждый кусок будет выполняться мультипроцессорно, но последовательно кусок за куском.
Вот тебе пример, как организовано мультипоточное сканирование диапазона IP-адресов:
ScanIP

Add(MainForm,2953706,105,168)
{
Width=395
Height=395
Caption="-= ScanIP =-"
Position=1
}
Add(Edit,4680663,308,168)
{
Left=55
Top=10
Width=125
Text="192.168.1.0"
}
Add(Label,15265933,98,112)
{
Left=10
Top=12
Width=42
Height=17
Caption="Start IP:"
Alignment=1
}
Add(Edit,16340481,518,168)
{
Left=245
Top=10
Width=125
Text="192.168.1.255"
}
Add(Label,2156216,105,119)
{
Left=203
Top=12
Width=39
Height=17
Caption="End IP:"
Alignment=1
}
Add(MTStrTbl,12744077,161,168)
{
Left=10
Top=40
Width=360
Height=280
Font=[MS Sans Serif,8,1,0,1]
Name="table_IP"
Columns=#4:N=37|12:IP-адрес=200|13:Состояние=100|
ColorItems=0
}
Add(Button,14940173,105,224)
{
Left=160
Top=330
TabOrder=-1
Caption="ScanIP"
Point(doEnabled)
link(onClick,10765232:doEvent1,[])
}
Add(MultiStrPart,1535533,308,224)
{
Char="."
Count=4
link(onSplit,7134467:doConvert,[(347,230)(347,160)(263,160)(263,300)])
link(Str,4680663:Text,[])
}
Add(ConvertorEx,7134467,273,294)
{
Mode=6
link(onResult,16218166:doConvert,[])
link(Data,1535533:Part1,[(279,264)(314,264)])
}
Add(ConvertorEx,16218166,315,294)
{
Mode=6
link(onResult,7324999:doConvert,[])
link(Data,1535533:Part2,[])
}
Add(ConvertorEx,7324999,357,294)
{
Mode=6
link(onResult,14151681:doConvert,[])
link(Data,1535533:Part3,[(363,285)(328,285)])
}
Add(ConvertorEx,14151681,399,294)
{
Mode=6
link(onResult,10593432:doStrCatDlm,[(438,300)(438,398)(291,398)(291,363)])
link(Data,1535533:Part4,[(405,278)(335,278)])
}
Add(StrCatDelim,10593432,301,357)
{
Point(Delimiter)
link(onStrCatDlm,15488589:doStrCat,[])
link(Str1,7134467:Var,[(307,348)(279,348)])
link(Str2,7324999:Var,[(314,334)(363,334)])
link(Delimiter,16218166:Var,[])
}
Add(StrCat,15488589,392,357)
{
link(onStrCat,7359826:doSplit,[(459,363)(459,230)])
link(Str2,14151681:Var,[])
}
Add(MultiStrPart,7359826,518,224)
{
Char="."
Count=4
link(onSplit,63245:doConvert,[(557,230)(557,160)(473,160)(473,300)])
link(Str,16340481:Text,[])
}
Add(ConvertorEx,63245,483,294)
{
Mode=6
link(onResult,11792885:doConvert,[])
link(Data,7359826:Part1,[(489,264)(524,264)])
}
Add(ConvertorEx,11792885,525,294)
{
Mode=6
link(onResult,8141778:doConvert,[])
link(Data,7359826:Part2,[])
}
Add(ConvertorEx,8141778,567,294)
{
Mode=6
link(onResult,11267527:doConvert,[])
link(Data,7359826:Part3,[(573,285)(538,285)])
}
Add(ConvertorEx,11267527,609,294)
{
Mode=6
link(onResult,7224005:doStrCatDlm,[(648,300)(648,412)(501,412)(501,363)])
link(Data,7359826:Part4,[(615,278)(545,278)])
}
Add(StrCatDelim,7224005,511,357)
{
Point(Delimiter)
link(onStrCatDlm,14920638:doStrCat,[])
link(Str1,63245:Var,[(517,348)(489,348)])
link(Str2,8141778:Var,[(524,334)(573,334)])
link(Delimiter,11792885:Var,[])
}
Add(StrCat,14920638,602,357)
{
link(onStrCat,6463665:doConvert,[(641,363)(641,405)(382,405)(382,440)])
link(Str2,11267527:Var,[])
}
Add(ConvertorEx,6463665,392,434)
{
Mode=5
link(onResult,9075156:doConvert,[])
link(Data,15488589:Result,[])
}
Add(ConvertorEx,9075156,602,434)
{
Mode=5
link(onResult,11963140:doCompare,[])
link(Data,14920638:Result,[])
}
Add(For,15538997,875,441)
{
link(onEvent,11342479:doOperation,[])
link(End,13537371:Result,[(888,432)(867,432)(867,474)(776,474)])
}
Add(GetDataEx,16748363,753,495)
{
Angle=3
link(Data,11070075:Var3,[])
}
Add(ConvertorEx,9472997,980,441)
{
Mode=6
link(onResult,11261530:doEvent1,[])
}
Add(Math,11342479,931,441)
{
ResultType=0
link(onResult,9472997:doConvert,[])
link(Op1,16748363:Var3,[(937,432)(923,432)(923,500)])
}
Add(MathParse,13537371,770,434)
{
MathStr="abs(%2 - %1)"
ResultType=0
link(onResult,8207842:doEvent1,[])
link(X1,16748363:Var1,[(776,425)(759,425)])
link(X2,9075156:Var,[(783,418)(657,418)(657,474)(608,474)])
}
Add(Str_Enum,6856085,1064,448)
{
Delimiter=""
Step=2
link(onEnum,7821165:doConvert,[])
link(onEndEnum,5883256:doTrim,[(1117,461)(1117,538)])
}
Add(ConvertorEx,7821165,1127,448)
{
Mode=5
link(onResult,5775142:doConvert,[])
}
Add(ConvertorEx,5775142,1176,448)
{
Digits=3
link(onResult,2739520:doStrCatDlm,[])
}
Add(Hub,11261530,1029,441)
{
link(onEvent1,2739520:doClear,[(1054,447)(1054,440)(1215,440)(1215,461)])
link(onEvent2,6856085:doEnum,[])
}
Add(StrCatDelim,2739520,1232,448)
{
Delimiter="."
Point(doClear)
link(Str1,2620208:Var3,[(1238,439)(1273,439)(1273,488)])
}
Add(GetDataEx,2620208,1232,483)
{
link(Data,2739520:Result,[])
}
Add(Trim,5883256,1232,532)
{
Char="."
Point(Result)
link(onTrim,7266221:doOperation,[])
link(Text,2620208:Var2,[])
}
Add(If_else,11963140,665,434)
{
Type=4
link(onTrue,13537371:doCalc,[])
link(onFalse,10452294:doMessage,[(704,447)(704,531)])
link(Op2,11070075:Var1,[(678,425)(748,425)])
}
Add(GetDataEx,11070075,742,495)
{
Angle=3
link(Data,6463665:Var,[(398,500)])
}
Add(Hub,8207842,812,434)
{
link(onEvent1,15218441:doClear,[(837,440)(837,391)])
link(onEvent2,15538997:doFor,[])
}
Add(Message,10452294,770,525)
{
Message="Конечный адрес должен\r\nбыть больше или равен стартовому"
Caption="-= ScanIP =-"
Icon=1
}
Add(StyleXP,14807685,161,119)
{
}
Add(CPUUsage,2563624,287,532)
{
}
Add(For,7653720,280,658)
{
IncludeEnd=1
link(onEvent,3802824:doEvent,[])
link(End,8969116:Var2,[])
}
Add(If_else,4127224,315,602)
{
link(onTrue,10461961:doReset,[])
link(onFalse,10461961:doOn,[])
link(Op1,5275191:##count,[(321,586)(405,586)(405,698)(447,698)])
}
Add(IndexToChanel,3802824,364,658)
{
Point(Index)
link(onEvent1,5275191:##add,[])
link(onEvent2,5275191:##select,[])
link(Index,10461961:State,[])
}
Add(Switch,10461961,364,595)
{
DataOn=Integer(1)
DataOff=Integer(0)
Point(State)
Point(doOn)
}
Add(GetDataEx,8969116,287,574)
{
link(Data,2563624:CPUCount,[])
}
Add(MultiElementEx,5275191,441,658)
{
@Hint=#18:MultiThread ScanIP|
Mode=1
link(onResult,8453156:doEvent1,[])
link(Array,8384296:Var2,[])
link(ThreadCount,8969116:Var3,[(454,579)])
link(EndIdx,3980825:EndIdx,[])
AddHint(57,-53,109,13,@Hint)
}
BEGIN_SDK
Add(EditMultiEx,6858109,14,14)
{
WorkCount=#5:##add|8:##select|
EventCount=#8:onResult|0:|
VarCount=#7:##count|4:Busy|
DataCount=#5:Array|11:ThreadCount|6:EndIdx|
Width=929
Height=396
VOffset=175
HOffset=14
Point(##add)
Point(##select)
Point(##count)
link(##add,4662741:doEvent1,[])
link(##select,4662741:doEvent2,[])
link(Busy,9458643:Busy,[(41,397)(237,397)])
}
Add(MT_Memory,79893,350,56)
{
link(onData,10875778:doSeparateMT,[])
}
Add(MT_AddData,3049757,679,273)
{
Count=4
link(onAdd,3283037:doValue,[])
link(Data1,12973651:Value1,[])
link(Data2,12973651:Value2,[])
link(Data3,15645917:Value,[(699,229)(741,229)])
link(Data4,1142509:Value,[(706,257)(636,257)])
}
Add(MT_MultiMem,12973651,679,189)
{
Count=4
Point(Data)
link(onData,3049757:doAdd,[(725,195)(725,314)(669,314)(669,279)])
link(Data,79893:Value,[(685,180)(356,180)])
}
Add(Memory,1142509,630,189)
{
link(onData,12973651:doValue,[])
}
Add(MT_Memory,3283037,749,273)
{
}
Add(SelectColor,10220941,504,56)
{
Color=11138509
link(onColor,9147621:doEvent1,[])
}
Add(SelectColor,6257194,504,98)
{
Color=12036852
link(onColor,4672522:doEvent1,[])
}
Add(HubEx,12944225,609,105)
{
Angle=1
link(onEvent,1142509:doValue,[(613,195)])
}
Add(Icon,12825104,119,189)
{
@Hint=#5:#main|
Icon=[ZIP9E09000078DA85960B5C8E771BC7AFFB793A90BDF62EAD37869943C9F44179FBCC71CA719A7DD89CD6C8184BB3CA2A858C281FAC19D23B8758A15E2D626528A488529E4E9E9ACE079188464B87E73EFCDEEB8E0C9F779F5DCFE77AFECF73DFFFFB7B5DF775B8AF9B48E08F9515F1773FDADA95C8928806B3F2211A4E4F8FABF27957FA5BD108A4659ED0F9BF7B17B2E86F41EF0DB412A60EED2938F57983AC8D0432E93C2F688CB41D3FB43DCCC9EC3DE7674785BF62ABAB9186BA4C184C0B7E58F046F2A50D360F2AFE3346F92DF85DFCFAAD23F2BEB76F3D12605FECE36A176E6B410E1DEEABD27B5D1839E844327AA77FA7E5FFC71ED19726C67858943D8E180DE9E014E5D18EF7712F74022ADC2D95A04387919D7F01FAA865A89380F6FA7CFCB46E5CAC99A55B284DBE0F8D07A019B425E6195EF32ADBD9963C4ABFB306A2A6A07683BD58E03548CAF71AA4E8570F47DE2C2DBCFE1B8BCB80F2EB7677393D72B5585E9625FB87168046668316CBB2B01230F9B24226CD108767644D277BF4409A53116A0339629254F48DB574C37B102A57D9A02AC016B7DC4C10B9D4011FE6FE8E0200FA681FDCF2EB8B0FC6AC02D964481AB73689D877725744D31D7C0F4336EEE94C8EBA98BF4696493E9675889C8422DFC17291AF2D0A97F7C4198FA14874B7C356FFF91876FE1636DC07EE1A5A7124D01D76A30E80C6D4C068B1011DECAF593D64C5781760FAC5D53AAE8CD73BE3F3F91861BD1839160D21F66289777F946C7084CECD1C1FC65E80A3AE0D2E250604D74BC862DFD74714817A254318590DCD8216D07285D9AC1C1B5AA940B319B2D9AE472093F7A775949540C6475758E995CDD638B7B89F7C21D019752B7BA3FA3353CC8E39834D8F80734F9A91DAD68E9BCC3F937317413EDF61E627113019710134B30EE4C76C3F05C2B7CCDFA888AFC5708CDEF60856F9037B09230BFCDE94CE7FDA0BCE093A8CBFDA80C5E1BBE1BF7915C69CC8866BA98474433B520C227221A3B61DA84D5903E5EC42F41B751CF4E96368D632DF1FE876428251F413C9F812A01D179EA8F2270D335E943397306F5FB4FC05C7F7C7070684FE017837007E7532120D0A8AD9EF0A05E0D3286E52509010045D9827C83E1B82AF0C5AC37E6FE3B887DDC3BFE79F9047AECD80C67E7F8ECAFFC89A02A23987A375AD52628B04BDA2A00812AAD8D7B29636A414E6A2B0AA0485A57A645FFC19E9E14B21C6CCC0D2793B412EF530DAC4BEAF661B11404FFF2264E756CAF5FA33D8EB3DADCC58A02E9F0C20DFE08D8B30B104D2C5D636C435B722A55D828EED94B3BF178E87A17893236A0E2DC383936B806B1B712E7C1BFB7E0514C8EC2005DACDBCEE6D82D33A1D9AB83F7E6B7888DC23AE6D7DBB93ED546B9A7D78A503C65E6F91CFB68938DB664016B3AFCA120AD55AAFA9C2CD1F66A03E6C3A94C425D0C76C81D5886320AF76082A375086491CAF2BF2B025FD361EAAB1AC2D57AA4F0560400F9AD8C7926CB23CFFF1646E6C12C29AA164496DC8942454F2BE7AD69A5619C5D15F428E9C8AC35E4B60E19800F26C87269899EB6598325B1B5401DBC05CE4F0FE8CAA5AE8AFC52935670231C09CA6A8398872EB7A3977CF1C7C56D028D7F09E16D6874DD5A82FFA0599C93FE1C88600CC9A1B059A5A0A4D00D7DE16D6DDACB15CF76B2B61B5E8343EBED1D85107B90F1FA1BCD980F349FBA581E664AFF25D866BDCDBC36D71F5D057626A69092E25446093DB522C1CF7157A8F66EECC2AAE6FCE6118FB1CCEB5B2BB19B4F916FA7AE760CDD14A6C6A90F0FD3DB1E3D9912D894A2BAF79493FDE3623FAA7CA3733A16E712B2C4A11351EED07C7CB8FB639C0D9FB18DE5C5989A19E37F1EEAA520CF0CCC270F75318E69E00F3800238ED2BC3E5C656A441C14DAE5D95AD63CD1439B82CBBFD5D8EBDF8EC1C6B4D736AB7DBE276D874F164A41FB24EF96357463C122519190619F999A781231FE17E942B9CD2ABE1D3A032659C6E31E068532BAEF2BEEB8AACD68424351663F250D359CF67D0331BDF38D1EE937B16C2B7E84EFBE9A616E5CADEE5082D2CE2BEE53ACA8C05E26703B11F6379DC49F8DE06EAB84F0A6405C95C733ABE8F74D120AAB139B17D51C62BA34B1D68EA98D5ACFF807EBE1B351DA985D7C5EC8410A9F8B8170AAFC4E0CE69AEFDB32B80534BB03D6E3F9CB8397636CAD8FF18B828B27D5912B9ED517EF940B3758FA779E5D83C9F312A9F45C38684E5CEA6DBCB0ECE8092C60D94B858C2E149A2727CBE2C5EDB09247F8DFC783F2C4D4AC5DCE46BCABC2B156258C93DB1F2F7872849DBD73CAABF76DAD3C922685F9DBFAA8DCE7C0CEF43130FF8D8E5DD495A0DDCD8A72087D91921403A376C668882BC1D502AE3813BE794C6D48D085DD63FE36D731AF257EC976D3C3DCFEF095AFBDE3475EDBC5ED1BF84CEA8D2C7FB18AACF87A02A652B0A13D74A67C366D705B9BE153FE22D7251B17FC77E69DE6B7834BC30A34D0532EBD79DECB82727A97DF9CEEB646F2650F73F13F8E7AC7D51FED0BA503D4DA67C32A6287661026B10DF4550C76BC78BFAB2043D5781AF11F85A2DFFD6501A736E53376AA27F91949647FF03FE72B73E]
}
Add(MT_Add,13302288,616,329)
{
InputMT=2
link(onAdd,212720:doEvent1,[])
link(Data,3283037:Value,[(622,320)(755,320)])
}
Add(Thread,9458643,231,322)
{
Delay=0
FastStop=0
BusyEvent=1
link(onExec,10368609:doAdd,[(270,328)(270,62)])
link(onSyncExec,13302288:doAdd,[])
}
Add(MT_MTArrayRW,6689186,175,322)
{
link(onRead,9458643:doStart,[])
link(Array,6858109:Array,[(181,229)(34,229)])
link(Index,5424527:Value,[(188,278)(202,278)])
}
Add(Hub,5752383,49,238)
{
link(onEvent1,8153238:doWork2,[])
link(onEvent2,16598786:doWork1,[(81,251)])
}
Add(HubEx,8153238,91,238)
{
link(onEvent,5424527:doValue,[])
}
Add(Hub,212720,665,329)
{
link(onEvent1,6858109:onResult,[(893,335)(893,195)])
link(onEvent2,15037475:doSeparateMT,[(690,342)(690,349)])
}
Add(If_else,6054776,847,343)
{
Type=3
link(onTrue,5752383:doEvent1,[(893,349)(893,391)(32,391)(32,244)])
link(onFalse,7601448:doEvent1,[(886,356)(886,384)(39,384)(39,279)])
link(Op2,6858109:EndIdx,[(860,33)(48,33)])
}
Add(MT_MultiData,15037475,700,343)
{
Count=1
Point(Data)
link(onData1,12268052:doOperation,[])
}
Add(Hub,4662741,49,189)
{
InCount=2
OutCount=3
link(onEvent1,8153238:doWork1,[(95,195)])
link(onEvent2,2721395:doReset,[(88,202)(88,272)])
link(onEvent3,11900908:doWork1,[(102,209)])
}
Add(Memory,5424527,196,238)
{
}
Add(Hub,7601448,49,273)
{
link(onEvent1,2721395:doOn,[])
link(onEvent2,16598786:doWork2,[])
}
Add(HubEx,16598786,77,280)
{
Angle=1
link(onEvent,11900908:doWork2,[(81,328)])
}
Add(MT_Add,10368609,301,56)
{
InputMT=2
link(onAdd,79893:doValue,[])
link(Data,6689186:Item,[(307,47)(293,47)(293,362)(181,362)])
}
Add(Math,12824464,798,343)
{
ResultType=0
link(onResult,6054776:doCompare,[])
link(Op1,6858109:ThreadCount,[(804,40)(41,40)])
}
Add(Math,12268052,749,343)
{
OpType=1
Op2=1
ResultType=0
link(onResult,12824464:doOperation,[])
}
Add(IndexToChanel,6556928,119,322)
{
Point(Index)
link(onEvent1,6689186:doRead,[])
link(onEvent2,9458643:doStop,[(165,335)(165,370)(214,370)(214,335)])
link(Index,2721395:State,[])
}
Add(Switch,2721395,119,259)
{
DataOn=Integer(1)
DataOff=Integer(0)
Point(State)
Point(doOn)
}
Add(HubEx,11900908,98,322)
{
link(onEvent,6556928:doEvent,[])
}
Add(Ping,3551483,448,56)
{
Name=""
TimeOut=200
link(onFind,10220941:doColor,[])
link(onFailed,6257194:doColor,[(494,69)(494,104)])
}
Add(MT_MultiData,10875778,399,56)
{
From=1
Count=1
Point(Data)
link(onData1,3551483:doPing,[])
}
Add(Hub,9147621,560,56)
{
link(onEvent1,11310484:doText,[])
link(onEvent2,12944225:doWork1,[(613,69)])
}
Add(Hub,4672522,560,98)
{
link(onEvent1,12555095:doText,[])
link(onEvent2,12944225:doWork2,[])
}
Add(Memory,15645917,735,56)
{
Default=String()
}
Add(VisualStrings,12555095,637,98)
{
Lines=#9:не в сети|
Width=67
Point(doText)
Point(onText)
link(onText,3902690:doWork3,[(718,104)])
}
Add(VisualStrings,11310484,637,56)
{
Lines=#6:в сети|
Width=67
Point(doText)
Point(onText)
link(onText,3902690:doWork2,[])
}
Add(HubEx,3902690,714,56)
{
link(onEvent,15645917:doValue,[])
}
END_SDK
Add(MST_ArrayRows,3980825,441,532)
{
MSTControl="table_IP"
}
Add(MST_Clear,15218441,875,385)
{
MSTControl="table_IP"
}
Add(MT_AddData,6328198,1344,532)
{
Count=4
link(onAdd,1881603:doRowAction,[])
link(Data1,7266221:Result,[(1350,523)(1336,523)(1336,572)(1287,572)])
link(Data2,5883256:Result,[(1357,516)(1273,516)(1273,572)(1238,572)])
link(Data3,9564505:Var2,[])
link(Data4,9564505:Var3,[(1371,516)])
}
Add(VisualStrings,898013,1358,469)
{
}
Add(MST_RowAction,1881603,1407,532)
{
MSTControl="table_IP"
}
Add(GetDataEx,9564505,1358,511)
{
link(Data,898013:Text,[])
}
Add(Math,7266221,1281,532)
{
Op2=1
ResultType=0
link(onResult,6328198:doAdd,[])
link(Op1,15538997:Position,[(1287,523)(881,523)])
}
Add(Hub,10765232,154,224)
{
OutCount=6
link(onEvent1,1535533:doSplit,[])
link(onEvent2,2455176:doClear,[(221,237)(221,825)(648,825)(648,797)])
link(onEvent3,15630150:doClear,[(214,244)(214,867)])
link(onEvent4,4127224:doCompare,[(206,251)(206,608)])
link(onEvent5,7653720:doFor,[(197,258)(197,664)])
link(onEvent6,11483898:doWork1,[(179,265)(179,279)(39,279)(39,230)])
}
Add(MT_MTArrayRW,14181587,742,651)
{
link(Array,8384296:Var3,[(748,586)])
link(Value,12484307:Value,[(762,642)(783,642)(783,698)(552,698)])
}
Add(MT_MultiData,15588294,602,658)
{
Count=1
Point(Data)
link(onData1,14365932:doOperation,[])
}
Add(Math,14365932,651,658)
{
OpType=1
Op2=1
ResultType=0
link(onResult,8181997:doEvent1,[])
}
Add(MT_Memory,12484307,546,658)
{
link(onData,15588294:doSeparateMT,[])
}
Add(GetDataEx,8384296,441,581)
{
link(Data,3980825:Strings,[])
}
Add(MST_SelectRow,5399022,742,707)
{
AutoMakeVisible=1
MSTControl="table_IP"
Point(doEnsureVisible)
}
Add(Hub,8181997,707,658)
{
link(onEvent1,14181587:doWrite,[])
link(onEvent2,4691629:doWork1,[(732,671)])
}
Add(HubEx,4691629,728,714)
{
link(onEvent,5399022:doEnsureVisible,[])
}
Add(Message,14007161,833,917)
{
Message="Сканирование завершено"
Caption="-= ScanIP =-"
Point(onOK)
link(onOK,11483898:doWork2,[(872,930)(872,958)(32,958)(32,237)])
}
Add(Math,2455176,721,784)
{
Op2=1
ResultType=0
Point(doClear)
link(onResult,855236:doWork1,[(844,790)])
link(Op1,10367022:Var1,[(727,775)(713,775)(713,824)])
}
Add(MT_MultiData,7216782,546,784)
{
From=2
Count=1
Point(Data)
link(onData1,3490678:doCompare,[])
}
Add(If_else,3490678,602,784)
{
Type=5
Op2=String(в сети)
link(onTrue,2455176:doOperation,[])
link(onFalse,15630150:doOperation,[(641,797)(641,860)])
}
Add(Math,15630150,686,854)
{
Op2=1
ResultType=0
Point(doClear)
link(onResult,855236:doWork2,[])
link(Op1,9521800:Var1,[(692,845)(678,845)(678,894)])
}
Add(GetDataEx,10367022,721,819)
{
link(Data,2455176:Result,[])
}
Add(GetDataEx,9521800,686,889)
{
link(Data,15630150:Result,[])
}
Add(If_else,3076957,749,910)
{
link(onTrue,4001312:doEvent1,[])
link(Op2,15349392:Var2,[])
}
Add(Math,9601970,686,910)
{
ResultType=0
link(onResult,3076957:doCompare,[])
link(Op1,9521800:Var2,[])
link(Op2,10367022:Var2,[(699,901)(727,901)])
}
Add(Hub,8453156,490,658)
{
OutCount=3
link(onEvent1,12484307:doValue,[])
link(onEvent2,7216782:doSeparateMT,[(522,671)(522,790)])
link(onEvent3,9601970:doOperation,[(515,678)(515,916)])
}
Add(ChanelToIndex,11483898,49,224)
{
link(onIndex,14940173:doEnabled,[])
}
Add(Hub,4001312,798,910)
{
link(onEvent1,15622533:doTimer,[(823,916)(823,769)(592,769)(592,720)])
link(onEvent2,14007161:doMessage,[])
}
Add(Timer,15622533,602,714)
{
Interval=200
Enable=1
AutoStop=1
link(onTimer,14011449:doData,[])
}
Add(DoData,14011449,651,714)
{
link(onEventData,4691629:doWork2,[])
link(Data,5399022:EndIdx,[(657,705)(720,705)(720,747)(769,747)])
}
Add(StatusBar,7525024,903,854)
{
}
Add(FormatStr,6653776,854,854)
{
DataCount=3
Mask="Всего: %3; в сети: %1; не в сети: %2 "
link(onFString,7525024:doText,[])
link(Str1,9521800:Var3,[(860,845)(818,845)(818,894)])
link(Str2,10367022:Var3,[(867,824)])
link(Str3,15349392:Var3,[(874,754)])
}
Add(HubEx,855236,840,854)
{
link(onEvent,6653776:doString,[])
}
Add(GetDataEx,15349392,756,749)
{
link(Data,5399022:Count,[])
}

Обрати внимание, что результат считывается в синхронном с основным потоком режиме и не мешает самим потокам. И еще учти то, что ни в коем случае не используй асинхронный режим работы (точка onExec) для вывода результата на визуальные элементы.

Леонид писал(а):
проходя мимо задержитесь здесь

Я постоянно читаю форум, но не пишу на нем, по вполне понятным причинам. Тч, я никуда пока не уходил полностью.

Редактировалось 4 раз(а), последний 2023-05-19 14:51:19
карма: 22

1
Голосовали:ric
Ответов: 1291
Рейтинг: 47
#9: 2023-05-20 03:24:52 ЛС | профиль | цитата
nesco, спасибо! Целая наука.. Буду вникать. И схема очень полезная в айти работе, я часто настраиваю камеры всякие.
Еще вопрос - а имеет ли смысл делить задачу на количество логических процессоров или это тоже потоки и не имеет смысла? Или это т.н. " гиперпоточность", которая реализована на более низком уровне и потому будет прирост производительности - параллелизма?

Редактировалось 2 раз(а), последний 2023-05-20 11:47:13
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Ответов: 871
Рейтинг: 322
#10: 2023-05-20 10:22:17 ЛС | профиль | цитата
nesco, Целиком присоединяюсь к Леониду.
карма: 1

0
Ответов: 1291
Рейтинг: 47
#11: 2023-05-20 11:46:21 ЛС | профиль | цитата
Схема nesco достойна включения в примеры работы с потоками - очень многому можно научиться.. Жаль, мои способности ставить лайк кончились, они по какому принципу работают - кто сколько тебя лайкнул - столько и ты можешь?)
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
Разработчик
Ответов: 26112
Рейтинг: 2124
#12: 2023-05-20 16:33:23 ЛС | профиль | цитата
Aziz писал(а):
Или это т.н. " гиперпоточность", которая реализована на более низком уровне и потому будет прирост производительности - параллелизма?

Именно так. Гиперпотоки, находящиеся внутри каждого ядра, для системы являются логическими процессорами. Это все реализованно на низком уровне, тк HT используют время простоя главного потока ядра и находятся на том же ядре, используют общий стек и общий конвеер. Прирост производительности будет по-любому и тем больше, чем меньше загружен основной поток ядра. Процессор с 4С+4HT приблизительно по производительности мультипоточности соответствует процессору 5С, те HT соответствует в среднем 25% производительности основного потока. Но это при больших нагрузках на основной поток, при маленьких нагрузках HT могут работать приблизительно одинаково с основным потоком.

Редактировалось 3 раз(а), последний 2023-05-20 16:37:52
карма: 22

0
Ответов: 1291
Рейтинг: 47
#13: 2023-05-20 17:30:38 ЛС | профиль | цитата
nesco, благодарю! Это здорово.
карма: 3
Hiasm + Flowstone + CopperCube + GoDot + JS
0
13
Сообщение
...
Прикрепленные файлы
(файлы не залиты)