информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Страшный баг в WindowsВсе любят медSpanning Tree Protocol: недокументированное применение
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft Authenticator прекращает... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
Я торможу или 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
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach