LINUX.ORG.RU

История изменений

Исправление SZT, (текущая версия) :

Всё работает по конкретным инструкциям внутри ШК. Для каждого чтения проверяется допустимость, и либо читается реальное значение, либо записывается диагностика

А по времени это работает так же? Ну вот допустим есть у нас условный код вида

bool x;
...
char a;
if (x)
{
  a = *(char *)0x24ff1455; // читаем что-то по какому-то адресу
}
else
{
  a = 10;
}
...

Предположим, внеочередное исполнение посчитало и ветку когда x == true и ветку когда x == false и при этом на адрес 0x24ff1455 в виртуальном адресном пространстве процесса может быть что-то отображено, или не отображено (т.е. адрес может быть невалидным и его разыменование приведет к ошибке сегментации, или может быть валидным и ошибки не будет, я знаю про наличие в Эльбрусах особых указателей с тегами, но предположим что это отключено). Если 0x24ff1455 при фактическом (не внеочередном) чтении окажется валидным, в кэш процессора попадут какие-то данные по тому адресу? А если чтение будет только при внеочередном (т.е. x окажется false и ветка с a = *(char *)0x24ff1455; по настоящему выполнена не будет, но указатель будет валидным), тогда в кэш процессора не попадут данные по тому адресу? А если попадут, будет ли время исполнения отличаться в варианте когда указатель (адрес) 0x24ff1455 валиден в сравнении с ситуацией когда указатель невалиден? Ну в любом случае если в кеш что-то попадает, это дает какие-то измеримые сайд-эффекты

Исправление SZT, :

Всё работает по конкретным инструкциям внутри ШК. Для каждого чтения проверяется допустимость, и либо читается реальное значение, либо записывается диагностика

А по времени это работает так же? Ну вот допустим есть у нас условный код вида

bool x;
...
char a;
if (x)
{
  a = *(char *)0x24ff1455; // читаем что-то по какому-то адресу
}
else
{
  a = 10;
}
...

Предположим, внеочередное исполнение посчитало и ветку когда x == true и ветку когда x == false и при этом на адрес 0x24ff1455 в виртуальном адресном пространстве процесса может быть что-то отображено, или не отображено (т.е. адрес может быть невалидным и его разыменование приведет к ошибке сегментации, или может быть валидным и ошибки не будет, я знаю про наличие в Эльбрусах особых указателей с тегами, но предположим что это отключено). Если 0x24ff1455 при фактическом (не внеочередном) чтении окажется валидным, в кэш процессора попадут какие-то данные по тому адресу? А если чтение будет только при внеочередном (т.е. x окажется false и ветка с a = *(char *)0x24ff1455; по настоящему выполнена не будет, но указатель будет валидным), тогда в кэш процессора не попадут данные по тому адресу? А если попадут, будет ли время исполнения отличаться в варианте когда адрес 0x24ff1455 валиден в сравнении с ситуацией когда указатель невалиден? Ну в любом случае если в кеш что-то попадает, это дает какие-то измеримые сайд-эффекты

Исправление SZT, :

Всё работает по конкретным инструкциям внутри ШК. Для каждого чтения проверяется допустимость, и либо читается реальное значение, либо записывается диагностика

А по времени это работает так же? Ну вот допустим есть у нас условный код вида

bool x;
...
char a;
if (x)
{
  a = *(char *)0x24ff1455; // читаем что-то по какому-то адресу
}
else
{
  a = 10;
}
...

Предположим, внеочередное исполнение посчитало и ветку когда x == true и ветку когда x == false и при этом на адрес 0x24ff1455 в виртуальном адресном пространстве процесса может быть что-то отображено, или не отображено (т.е. адрес может быть невалидным и его разыменование приведет к ошибке сегментации, или может быть валидным и ошибки не будет, я знаю про наличие в Эльбрусах особых указателей с тегами, но предположим что это отключено). Если 0x24ff1455 при фактическом (не внеочередном) чтении окажется валидным, в кэш процессора попадут какие-то данные по тому адресу? А если чтение будет только при внеочередном (т.е. x окажется false и ветка с a = *(char *)0x24ff1455; по настоящему выполнена не будет, но указатель будет валидным), тогда в кэш процессора не попадут данные по тому адресу?

Исходная версия SZT, :

Всё работает по конкретным инструкциям внутри ШК. Для каждого чтения проверяется допустимость, и либо читается реальное значение, либо записывается диагностика

А по времени это работает так же? Ну вот допустим есть у нас условный код вида

[code=c] bool x; … char a; if (x) { a = *(char *)0x24ff1455; // читаем что-то по какому-то адресу } else { a = 10; } … [/code]

Предположим, внеочередное исполнение посчитало и ветку когда x == true и ветку когда x == false и при этом на адрес 0x24ff1455 в виртуальном адресном пространстве процесса может быть что-то отображено, или не отображено (т.е. адрес может быть невалидным и его разыменование приведет к ошибке сегментации, или может быть валидным и ошибки не будет, я знаю про наличие в Эльбрусах особых указателей с тегами, но предположим что это отключено). Если 0x24ff1455 при фактическом (не внеочередном) чтении окажется валидным, в кэш процессора попадут какие-то данные по тому адресу? А если чтение будет только при внеочередном (т.е. x окажется false и ветка с [inline]a = *(char *)0x24ff1455; [/inline] по настоящему выполнена не будет, но указатель будет валидным), тогда в кэш процессора не попадут данные по тому адресу?