Решил я для интереса померить разницу в счетчиках тактов между процессорами на двухпроцессорной машине (Dual Athlon-MP, MSI). И вот ни как не могу найти ошибку:
// готовимся и стартуем
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). И вот ни как не могу найти ошибку: > > Имееться функция: >
> // готовимся и стартуем
> 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