информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Все любят медГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Notepad++ полгода раздавал зараженные... 
 Китайский прорыв из ESXi 
 С наступающим 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
В коде ошибок нет, все вылечилось после замены памяти ! 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
<"чистая" ссылка>
1




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


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