атомарность в 32/64 бит - PullRequest
5 голосов
/ 26 июня 2010

Вопрос в том, когда 64-битные операции загрузки / сохранения считаются атомарными.

  • если у меня 64-битный процессор, но я использую 32-битную ОС. Будет ли у меня 64-битная атомарность?
  • если я использую 64-битную ОС, но использую 32-битное приложение (использующее WoW64), будет ли у меня 64-битная атомарность?

Ответы [ 3 ]

4 голосов
/ 26 июня 2010

Приложение должно работать на 64-битной ОС и в собственном 64-битном режиме, что неудивительно. Если вы работаете в 32-битном режиме, либо в 32-битной ОС (с 32-битным приложением), вы получите 32-битную атомарность. Если вы используете 64-битный режим на 64-битной ОС на 64-битном процессоре, вы получите 64-битную атомарность. Все компоненты в цепочке (приложение, ОС, ЦП) должны работать на 64-битной основе, чтобы получить 64-битную.

3 голосов
/ 26 июня 2010

Не по умолчанию!Но некоторые инструкции SSE под x86 поддерживают 64-битную и 128-битную атомарную загрузку / хранилище, конечно же, вы должны сначала обеспечить выравнивание памяти.Смотрите примеры:

procedure Move64(var Source, Destination);
//Move 8 bytes atomicly from Source 8-byte aligned to Destination!
asm
  movq  xmm0, qword [Source]
  movq  qword [Destination], xmm0
end;

procedure Move64(newData: pointer; newReference: cardinal; var Destination); overload; 
//Move 8 bytes atomically into 8-byte Destination!
asm
  movd  xmm0, eax
  movd  xmm1, edx
  punpckldq xmm0, xmm1
  movq  qword [Destination], xmm0
end; 

procedure Move128(var Source, Destination);
//Move 16 bytes atomicly from Source to 16-byte aligned to Destination!
asm
  movdqa  xmm0, dqword [Source]
  movdqa  dqword [Destination], xmm0
end;
3 голосов
/ 26 июня 2010

Только 32/64 "битность" приложения имеет значение - то есть, что ваши 64-битные загрузки / хранилища являются атомарными на уровне сборки.
Вам нужно 64-битное приложение, чтобы получить это "бесплатно". *
Для 64-битного приложения вам нужен 64-битный процессор и ОС, которая может его выполнять.
Операционная система может быть любой, если только она может запустить 64-битный процесс на 64-битном процессоре.

, если у меня 64-битный процессор, но я использую 32-битную ОС.Будет ли у меня 64-битная атомарность?

32-битная Windows, Linux: вы просто не можете запускать 64-битные приложения на 32-битной Windows или Linux, даже на 64-битном ЦП.
32-битнаяMac OS X : если ваше приложение является 64-битным приложением, то да.

если я использую 64-битную ОС, но использую 32-битное приложение (использующее WoW64), у меня будет 64-битная атомарность?

Нет.Ваши загрузки и сохранения на уровне машинного кода все равно будут 32-разрядными загрузками и сохранятся, если вы используете 32-разрядное приложение.

* Вы можете получить 64-битные атомарные операции чтения / записи на 32-битном ЦП с встроенными встроенными функциями компилятора и / или прямой сборкой .

...