атомарность в 32/64 бита

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

  • если у меня есть процессор на 64 бита, но я использую ОС на 32 бита. У меня будет атомарность на 64 бита?
  • если я буду использовать ОС на 64 бита, но запускать приложение на 32 бита (использующий WoW64), то у меня будет атомарность на 64 бита?
5
задан 26 June 2010 в 09:09
поделиться

3 ответа

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

4
ответ дан 13 December 2019 в 22:01
поделиться

Значение имеет только 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-битном процессоре с помощью встроенных функций компилятора, где они доступны, и / или прямой сборки .

3
ответ дан 13 December 2019 в 22:01
поделиться

Не по умолчанию! Но некоторые инструкции 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
ответ дан 13 December 2019 в 22:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: