История изменений
Исправление 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] по настоящему выполнена не будет, но указатель будет валидным), тогда в кэш процессора не попадут данные по тому адресу?