Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |  |
В коде ошибок нет, все вылечилось после замены памяти ! 18.02.03 17:38 Число просмотров: 1098
Автор: leo <Леонид Юрьев> Статус: Elderman
|
|
|
|
<programming>
|
Я торможу или bug в Athlon 15.01.03 22:01
Автор: leo <Леонид Юрьев> Статус: Elderman Отредактировано 15.01.03 22:01 Количество правок: 1
|
Решил я для интереса померить разницу в счетчиках тактов между процессорами на двухпроцессорной машине (Dual Athlon-MP, MSI). И вот ни как не могу найти ошибку:
Имееться функция:
function SyncRdtsc(TestValue1, SetValue1, TestValue2, SetValue2: Cardinal; var SyncPoint: Cardinal): Int64; stdcall;
asm
PUSH EBX
MOV EBX, SyncPoint
MOV ECX, TestValue1
MOV EDX, SetValue1
@1:
MOV EAX, ECX
PAUSE
LOCK CMPXCHG [EBX], EDX
JNZ @1
MOV ECX, TestValue2
MOV EDX, SetValue2
@2:
MOV EAX, ECX
PAUSE
LOCK CMPXCHG [EBX], EDX
JNZ @2
//XOR EAX, EAX
//CPUID
RDTSC
POP EBX
end; ---
И код который её вызывает:
// готовимся и стартуем
FSyncPoint := 1;
StartThreadA;
StartThreadB;
[...]
// синхронизируемся и замеряем в разных thread
if Thread = FThreadA then
begin
Assert(FSyncPoint < 2);
FTicksA := SyncRdtsc(1, 2, 3, 4, FSyncPoint)
end
else
if Thread = FThreadB then
begin
Assert(FSyncPoint < 3);
FTicksB := SyncRdtsc(2, 3, 4, 5, FSyncPoint)
end
---
Cоответственно создаются два thread по одному для каждого процессора, для тредов выставлен AffinityMask чтобы каждый работал только на одном из двух CPU.
Функция SyncRdtsc реализует простейшую двухфазную синхронизацию.
Алгоритм такой:
1) По входу SyncPoint:= 1
2) ThreadA ожидает 1 и пишет 2
3) ThreadB ожидает 2 и пишет 3
4) ThreadA ожидает 3 и пишет 4
5) ThreadB ожидает 4 и пишет 5
Проблема в следующем:
При выполнении, с некоторой вероятностью один из тредов проходит синхронизацию, а второй зацикливается в одном из циклов.
Но при добавлении CPUID, что вызывает серелизацию процессора, все работает.
Дак вот, это bug или мне пора спать ?
У кого какие идеи ?
|
 |
Ну походу да чуток есть 02.02.03 05:17
Автор: MOGUL Статус: Незарегистрированный пользователь
|
> Решил я для интереса померить разницу в счетчиках тактов > между процессорами на двухпроцессорной машине (Dual > Athlon-MP, MSI). И вот ни как не могу найти ошибку: > > Имееться функция: > function SyncRdtsc(TestValue1, SetValue1, > TestValue2, SetValue2: Cardinal; var SyncPoint: Cardinal):
> Int64; stdcall;
> asm
> PUSH EBX
> MOV EBX, SyncPoint
>
> MOV ECX, TestValue1
> MOV EDX, SetValue1
> @1:
> MOV EAX, ECX
> PAUSE
> LOCK CMPXCHG [EBX], EDX
> JNZ @1
>
> MOV ECX, TestValue2
> MOV EDX, SetValue2
> @2:
> MOV EAX, ECX
> PAUSE
> LOCK CMPXCHG [EBX], EDX
> JNZ @2
>
> //XOR EAX, EAX
> //CPUID
>
> RDTSC
> POP EBX
> end; ---
> > И код который её вызывает: > > // готовимся и стартуем
> FSyncPoint := 1;
> StartThreadA;
> StartThreadB;
> [...]
> // синхронизируемся и замеряем в разных thread
> if Thread = FThreadA then
> begin
> Assert(FSyncPoint < 2);
> FTicksA := SyncRdtsc(1, 2, 3, 4, FSyncPoint)
> end
> else
> if Thread = FThreadB then
> begin
> Assert(FSyncPoint < 3);
> FTicksB := SyncRdtsc(2, 3, 4, 5, FSyncPoint)
> end
> ---
> > Cоответственно создаются два thread по одному для каждого > процессора, для тредов выставлен AffinityMask чтобы каждый > работал только на одном из двух CPU. > > Функция SyncRdtsc реализует простейшую двухфазную > синхронизацию. > Алгоритм такой: > 1) По входу SyncPoint:= 1 > 2) ThreadA ожидает 1 и пишет 2 > 3) ThreadB ожидает 2 и пишет 3 > 4) ThreadA ожидает 3 и пишет 4 > 5) ThreadB ожидает 4 и пишет 5 > > Проблема в следующем: > При выполнении, с некоторой вероятностью один из тредов > проходит синхронизацию, а второй зацикливается в одном из > циклов. > Но при добавлении CPUID, что вызывает серелизацию > процессора, все работает. > > Дак вот, это bug или мне пора спать ? > У кого какие идеи ? Ну идея тут одна ты асм посмотри повнимательней глупо немного налабал...
|
 |  |
В коде ошибок нет, все вылечилось после замены памяти ! 18.02.03 17:38
Автор: leo <Леонид Юрьев> Статус: Elderman
|
|
|
 |
ни у кого нет денег на двухпроцерную мамку :) 02.02.03 04:53
Автор: vh <Дмитрий> Статус: Member
|
|
|
 |
Ну неужели никто не "шарит" ? 16.01.03 19:28
Автор: leo <Леонид Юрьев> Статус: Elderman
|
|
|
|
|