purebasic.info

PureBasic forum
Текущее время: Сб июн 23, 2018 10:32 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу Пред.  1, 2
Автор Сообщение
 Заголовок сообщения: Re: Скорость циклов
СообщениеДобавлено: Пн фев 19, 2018 5:54 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2275
Откуда: Russia — Belarus
Благодарил (а): 5 раз.
Поблагодарили: 71 раз.
Пункты репутации: 11
sergey2400 писал(а):
Цитата:
Появится сообщение про лимит в 128 символов.
Но после него PB не будет компилировать ни один проект, даже простой Debug "OK" например :).

У меня после компилирует Debug "OK", без перезагрузки, и 5.44, и 5.60, 32 и 64 версии.

Забыл написать. У меня 5.62 x64.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Скорость циклов
СообщениеДобавлено: Чт мар 01, 2018 2:05 pm 
Не в сети
док
Аватар пользователя

Зарегистрирован: Вт янв 26, 2016 4:44 pm
Сообщений: 145
Благодарил (а): 50 раз.
Поблагодарили: 19 раз.
Пункты репутации: 0
Здравствуйте.
Вот упрощённый проблемный код:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
EnableExplicit
 
Define.i q=0,w=0, time=0, t1.f=0, t2=0
Define.i a=0,b=0,c=0,d=0,e=0
For q = 1 To 40000000
Next q
time = GetTickCount_()
  For w= 0 To 100000000
    a=1+2
    b=a+2
    c=b+2
    d=c+2
    e=d+2
    Next w
t1 =(GetTickCount_() - time);/1000
MessageRequester("", " Время работы кода в миллисекундах : " + t1)


Проблема та же, необъяснимые тормоза, особенно на AMD, состояние компьютера и ОС не причём...

Ну в общем, не много разобрался, на AMD происходят сильные тормоза (тормозят все вычисления в разы), если в коде есть строка MessageRequester ("", " Время работы кода в миллисекундах : " + t1) и в ней используется переменная с типом float или Double. Повторюсь, при этом притормаживает ВЕСЬ код, а не эта строка.

Если перед этой строкой сделать преобразование в виде t2.i=t1.f и в MessageRequester использовать t2, то торможений не происходит.

Залез в ASM - код:
без торможения:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
; PureBasic 5.46 LTS (Windows - x64) generated code
;
; (c) 2016 Fantaisie Software
;
; The header must remain intact for Re-Assembly
;
; String
; Requester
; FileSystem
; Date
; Object
; SimpleList
; :System
; kernel32.lib
; :Import
;
format MS64 COFF
;
;
extrn PB_FreeFileSystem
extrn PB_FreeObjects
extrn PB_InitRequester
extrn PB_MessageRequester_UNICODE
extrn PB_Str_UNICODE
extrn ExitProcess
extrn GetModuleHandleW
extrn GetTickCount
extrn HeapCreate
extrn HeapDestroy
extrn memset
extrn SYS_CopyString
extrn PB_StringBase
extrn SYS_InitString
extrn SYS_FreeStrings
;
extrn PB_StringBasePosition
public _PB_Instance
public PB_ExecutableType
public PB_OpenGLSubsystem
public _PB_MemoryBase
public PB_Instance
public PB_MemoryBase
public PB_EndFunctions
 
macro pb_public symbol
{
  public  _#symbol
  public symbol
_#symbol:
symbol:
}
 
macro    pb_align value { rb (value-1) - ($-_PB_DataSection + value-1) mod value }
macro pb_bssalign value { rb (value-1) - ($-_PB_BSSSection  + value-1) mod value }
 
public PureBasicStart
;
section '.code' code readable executable align 4096
;
;
PureBasicStart:
;
  SUB    rsp,40
  MOV    r8,I_BSSEnd-I_BSSStart
  XOR    rdx,rdx
  MOV    rcx,I_BSSStart
  CALL  memset
  XOR    rcx,rcx
  CALL  GetModuleHandleW
  MOV    [PB_Instance],rax
  XOR    r8,r8
  MOV    rdx,4096
  XOR    rcx,rcx
  CALL  HeapCreate
  MOV    [PB_MemoryBase],rax
  CALL  SYS_InitString
  CALL  PB_InitRequester
; EnableExplicit
;
; Define.i q=0,w=0, time=0, t1.i=0
  MOV    qword [v_q],0
  MOV    qword [v_w],0
  MOV    qword [v_time],0
  MOV    qword [v_t1],0
; Define.i a=0,b=0,c=0,d=0,e=0
  MOV    qword [v_a],0
  MOV    qword [v_b],0
  MOV    qword [v_c],0
  MOV    qword [v_d],0
  MOV    qword [v_e],0
; For q = 1 To 40000000
  MOV    qword [v_q],1
  JMP   _ForSkipDebug1
_For1:
_ForSkipDebug1:
 MOV    rax,40000000
  CMP    rax,qword [v_q]
  JL    _Next2
; Next q
_NextContinue2:
 INC   qword [v_q]
  JNO   _For1
_Next2:
; time = GetTickCount_()
  CALL  GetTickCount
  MOV    qword [v_time],rax
; For w= 0 To 10000000
  MOV    qword [v_w],0
  JMP   _ForSkipDebug3
_For3:
_ForSkipDebug3:
 MOV    rax,10000000
  CMP    rax,qword [v_w]
  JL    _Next4
; a=1+2
  MOV    qword [v_a],3
; b=a+2
  MOV    r15,qword [v_a]
  ADD    r15,2
  MOV    qword [v_b],r15
; c=b+2
  MOV    r15,qword [v_b]
  ADD    r15,2
  MOV    qword [v_c],r15
; d=c+2
  MOV    r15,qword [v_c]
  ADD    r15,2
  MOV    qword [v_d],r15
; e=d+2
  MOV    r15,qword [v_d]
  ADD    r15,2
  MOV    qword [v_e],r15
; Next w
_NextContinue4:
 INC   qword [v_w]
  JNO   _For3
_Next4:
;
;
; t1 =(GetTickCount_() - time)
  CALL  GetTickCount
  MOV    r15,rax
  SUB    r15,qword [v_time]
  MOV    qword [v_t1],r15
; MessageRequester("", "      : " + t1)
  MOV    rax,[PB_StringBasePosition]
  PUSH   rax
  SUB    rsp,8
  PUSH   rax
  MOV    rcx,_S2
  SUB    rsp,40
  CALL  SYS_CopyString
  ADD    rsp,40
  MOV    rcx,qword [v_t1]
  MOV    rdx,[PB_StringBasePosition]
  PUSH   rdx
  PUSH   rdx
  POP    rdx
  SUB    rsp,32
  CALL  PB_Str_UNICODE
  ADD    rsp,32
  POP    rax
  ADD    qword [PB_StringBasePosition],2
  MOV    rax,_S1
  PUSH   rax
  MOV    rdx,[PB_StringBase]
  ADD    [rsp+8],rdx
  POP    rcx
  POP    rdx
  SUB    rsp,32
  CALL  PB_MessageRequester_UNICODE
  ADD    rsp,40
  POP    qword [PB_StringBasePosition]
_PB_EOP:
 CALL  PB_EndFunctions
  CALL  SYS_FreeStrings
  MOV    rcx,[PB_MemoryBase]
  CALL  HeapDestroy
  MOV    rcx,[PB_ExitCode]
  CALL  ExitProcess
PB_EndFunctions:
 SUB    rsp,40
  CALL  PB_FreeFileSystem
  CALL  PB_FreeObjects
  ADD    rsp,40
  RET
;
;
section '.data' data readable writeable
;
_PB_DataSection:
PB_OpenGLSubsystem: db 0
pb_public PB_DEBUGGER_LineNumber
  dd     -1
pb_public PB_DEBUGGER_IncludedFiles
  dd     0
pb_public PB_DEBUGGER_FileName
  db     0
pb_public PB_Compiler_Unicode
  dd     1
pb_public PB_Compiler_Thread
  dd     0
pb_public PB_Compiler_Purifier
  dd     0
pb_public PB_Compiler_Debugger
  dd     0
PB_ExecutableType: dd 0
pb_align 8
public _SYS_StaticStringStart
_SYS_StaticStringStart:
_S1: dw 0
_S2: dw 32,1042,1088,1077,1084,1103,32,1088,1072,1073,1086,1090,1099,32,1082,1086,1076,1072,32,1074,32,1084,1080,1083,1083,1080,1089,1077,1082,1091,1085,1076,1072,1093,32,58,32,0
pb_public PB_NullString
  dw     0
public _SYS_StaticStringEnd
_SYS_StaticStringEnd:
pb_align 8
pb_align 8
pb_align 8
s_s:
 dq     0
  dq     -1
pb_align 8
;
section '.bss' readable writeable
_PB_BSSSection:
pb_bssalign 8
;
I_BSSStart:
_PB_MemoryBase:
PB_MemoryBase: rq 1
_PB_Instance:
PB_Instance: rq 1
PB_ExitCode: rq 1
;
pb_bssalign 8
PB_DataPointer rq 1
v_a rq 1
v_b rq 1
v_c rq 1
v_d rq 1
v_e rq 1
v_q rq 1
v_w rq 1
v_t1 rq 1
v_time rq 1
pb_bssalign 8
pb_bssalign 8
pb_bssalign 8
pb_bssalign 8
I_BSSEnd:
section '.data' data readable writeable
SYS_EndDataSection:



С торможением:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
; PureBasic 5.46 LTS (Windows - x64) generated code
;
; (c) 2016 Fantaisie Software
;
; The header must remain intact for Re-Assembly
;
; String
; Requester
; FileSystem
; Date
; Object
; SimpleList
; :System
; kernel32.lib
; :Import
;
format MS64 COFF
;
;
extrn PB_FreeFileSystem
extrn PB_FreeObjects
extrn PB_InitRequester
extrn PB_MessageRequester_UNICODE
extrn PB_StrF_UNICODE
extrn ExitProcess
extrn GetModuleHandleW
extrn GetTickCount
extrn HeapCreate
extrn HeapDestroy
extrn memset
extrn SYS_CopyString
extrn PB_StringBase
extrn SYS_InitString
extrn SYS_FreeStrings
;
extrn PB_StringBasePosition
public _PB_Instance
public PB_ExecutableType
public PB_OpenGLSubsystem
public _PB_MemoryBase
public PB_Instance
public PB_MemoryBase
public PB_EndFunctions
 
macro pb_public symbol
{
  public  _#symbol
  public symbol
_#symbol:
symbol:
}
 
macro    pb_align value { rb (value-1) - ($-_PB_DataSection + value-1) mod value }
macro pb_bssalign value { rb (value-1) - ($-_PB_BSSSection  + value-1) mod value }
 
public PureBasicStart
;
section '.code' code readable executable align 4096
;
;
PureBasicStart:
;
  SUB    rsp,40
  MOV    r8,I_BSSEnd-I_BSSStart
  XOR    rdx,rdx
  MOV    rcx,I_BSSStart
  CALL  memset
  XOR    rcx,rcx
  CALL  GetModuleHandleW
  MOV    [PB_Instance],rax
  XOR    r8,r8
  MOV    rdx,4096
  XOR    rcx,rcx
  CALL  HeapCreate
  MOV    [PB_MemoryBase],rax
  CALL  SYS_InitString
  CALL  PB_InitRequester
; EnableExplicit
;
; Define.i q=0,w=0, time=0, t1.f=0
  MOV    qword [v_q],0
  MOV    qword [v_w],0
  MOV    qword [v_time],0
  MOV    dword [v_t1],0
; Define.i a=0,b=0,c=0,d=0,e=0
  MOV    qword [v_a],0
  MOV    qword [v_b],0
  MOV    qword [v_c],0
  MOV    qword [v_d],0
  MOV    qword [v_e],0
; For q = 1 To 40000000
  MOV    qword [v_q],1
  JMP   _ForSkipDebug1
_For1:
_ForSkipDebug1:
 MOV    rax,40000000
  CMP    rax,qword [v_q]
  JL    _Next2
; Next q
_NextContinue2:
 INC   qword [v_q]
  JNO   _For1
_Next2:
; time = GetTickCount_()
  CALL  GetTickCount
  MOV    qword [v_time],rax
; For w= 0 To 10000000
  MOV    qword [v_w],0
  JMP   _ForSkipDebug3
_For3:
_ForSkipDebug3:
 MOV    rax,10000000
  CMP    rax,qword [v_w]
  JL    _Next4
; a=1+2
  MOV    qword [v_a],3
; b=a+2
  MOV    r15,qword [v_a]
  ADD    r15,2
  MOV    qword [v_b],r15
; c=b+2
  MOV    r15,qword [v_b]
  ADD    r15,2
  MOV    qword [v_c],r15
; d=c+2
  MOV    r15,qword [v_c]
  ADD    r15,2
  MOV    qword [v_d],r15
; e=d+2
  MOV    r15,qword [v_d]
  ADD    r15,2
  MOV    qword [v_e],r15
; Next w
_NextContinue4:
 INC   qword [v_w]
  JNO   _For3
_Next4:
;
;
; t1 =(GetTickCount_() - time)
  CALL  GetTickCount
  MOV    qword [rsp-8],rax
  FILD   qword [rsp-8]
  FILD   qword [v_time]
  FSUBP  st1,st0
  FADD   dword [F1]
  FSTP   dword [v_t1]
; MessageRequester("", "      : " + t1)
  MOV    rax,[PB_StringBasePosition]
  PUSH   rax
  SUB    rsp,8
  PUSH   rax
  MOV    rcx,_S2
  SUB    rsp,40
  CALL  SYS_CopyString
  ADD    rsp,40
  MOV    eax,dword [v_t1]
  PUSH   rax
  MOVSS  xmm0,dword [rsp]
  ADD    rsp,8
  MOV    rdx,[PB_StringBasePosition]
  PUSH   rdx
  PUSH   rdx
  POP    rdx
  SUB    rsp,32
  CALL  PB_StrF_UNICODE
  ADD    rsp,32
  POP    rax
  ADD    qword [PB_StringBasePosition],2
  MOV    rax,_S1
  PUSH   rax
  MOV    rdx,[PB_StringBase]
  ADD    [rsp+8],rdx
  POP    rcx
  POP    rdx
  SUB    rsp,32
  CALL  PB_MessageRequester_UNICODE
  ADD    rsp,40
  POP    qword [PB_StringBasePosition]
_PB_EOP:
 CALL  PB_EndFunctions
  CALL  SYS_FreeStrings
  MOV    rcx,[PB_MemoryBase]
  CALL  HeapDestroy
  MOV    rcx,[PB_ExitCode]
  CALL  ExitProcess
PB_EndFunctions:
 SUB    rsp,40
  CALL  PB_FreeFileSystem
  CALL  PB_FreeObjects
  ADD    rsp,40
  RET
;
;
section '.data' data readable writeable
;
_PB_DataSection:
PB_OpenGLSubsystem: db 0
pb_public PB_DEBUGGER_LineNumber
  dd     -1
pb_public PB_DEBUGGER_IncludedFiles
  dd     0
pb_public PB_DEBUGGER_FileName
  db     0
pb_public PB_Compiler_Unicode
  dd     1
pb_public PB_Compiler_Thread
  dd     0
pb_public PB_Compiler_Purifier
  dd     0
pb_public PB_Compiler_Debugger
  dd     0
PB_ExecutableType: dd 0
pb_align 8
public _SYS_StaticStringStart
_SYS_StaticStringStart:
_S1: dw 0
_S2: dw 32,1042,1088,1077,1084,1103,32,1088,1072,1073,1086,1090,1099,32,1082,1086,1076,1072,32,1074,32,1084,1080,1083,1083,1080,1089,1077,1082,1091,1085,1076,1072,1093,32,58,32,0
pb_public PB_NullString
  dw     0
public _SYS_StaticStringEnd
_SYS_StaticStringEnd:
pb_align 8
F1: dd 0
pb_align 8
pb_align 8
s_s:
 dq     0
  dq     -1
pb_align 8
;
section '.bss' readable writeable
_PB_BSSSection:
pb_bssalign 8
;
I_BSSStart:
_PB_MemoryBase:
PB_MemoryBase: rq 1
_PB_Instance:
PB_Instance: rq 1
PB_ExitCode: rq 1
;
pb_bssalign 8
PB_DataPointer rq 1
v_a rq 1
v_b rq 1
v_c rq 1
v_d rq 1
v_e rq 1
v_q rq 1
v_w rq 1
v_time rq 1
v_t1 rd 1
pb_bssalign 8
pb_bssalign 8
pb_bssalign 8
pb_bssalign 8
I_BSSEnd:
section '.data' data readable writeable
SYS_EndDataSection:
 


Я почему-то думаю (чую), что проблема связана с
159 MOVSS xmm0,dword [rsp]
Это единственное значимое изменение, использование sse. Я честно говоря пока ещё не читал, как использование sse влияет на остальной код, знаю поверхностно.
Из описания: movss
Цитата:
movss переводит значение одинарной точности между источником и адресатом. По крайней мере одним из операндов должен быть регистр SSE, вторым может быть либо тоже регистр SSE, либо 32-битное расположение в памяти.

На сколько я догадываюсь, xmm0 - это регистр SSE. В общем не важно...

Хочу попробовать избавится от команды MOVSS xmm0,dword [rsp] или очистить регистр, пусть результат в MessageRequester будет не верным, это не важно, хочу разобраться

В общем, есть ли способ подредактировать asm-файл и скомпилировать в ручную?


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу Пред.  1, 2

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB