(C ++) Получение ошибки «Недопустимая инструкция (ядро сброшено)» при побитовой операции ИЛИ

Итак, я все еще изучаю побитовые операции и не могу понять, почему происходит эта ошибка. Я гуглил его, и кажется, что эта ошибка может возникнуть при работе со стеком, или, в некоторых случаях, это связано с архитектурой процессора. Я пытался скомпилировать с различными флагами, которые должны были помочь, но я не могу заставить его работать.

Вот код быстро:

int corners = 0;
for (int i = 0; i < 8; i++)
{
const ivec3 cornerPos = leaf->min + CHILD_MIN_OFFSETS[i];
const float density = Density_Func(vec3(cornerPos));
const int material = density < 0.f ? MATERIAL_SOLID : MATERIAL_AIR;
corners |= (material << i);
}

И ошибка «Недопустимая инструкция (ядро сброшено)» происходит на линии

corners |= (material << i);

Вот вывод отладчика:

Signal received: SIGILL (Illegal instruction) For program, pid 26,118

Я собираюсь дать вывод этого цикла (он никогда не проходит через первый цикл).
Вот код для кроваток:

int corners = 0;
std::cout<<"corners(outside loop): "<<corners<<std::endl;

for (int i = 0; i < 8; i++)
{
const ivec3 cornerPos = leaf->min + CHILD_MIN_OFFSETS[i];
std::cout<<"cornerPos.x: "<<cornerPos.x<<std::endl;
std::cout<<"cornerPos.y: "<<cornerPos.y<<std::endl;
std::cout<<"cornerPos.z: "<<cornerPos.z<<std::endl;

const float density = Density_Func(vec3(cornerPos));
std::cout<<"density: "<<density<<std::endl;

const int material = density < 0.f ? MATERIAL_SOLID : MATERIAL_AIR;
std::cout<<"material: "<<material<<std::endl;

std::cout<<"MATERIAL_SOLID: "<<MATERIAL_SOLID<<std::endl;
std::cout<<"MATERIAL_AIR: "<<MATERIAL_AIR<<std::endl;
std::cout<<"i: "<<i<<std::endl;

corners |= (material << i);
std::cout<<"corners(inside loop): "<<corners<<std::endl;
}

и вот вывод:

[corners(outside loop): 0] [cornerPos.x: -32] [cornerPos.y: -32] [cornerPos.z: -32] [density: -30] [material: 1] [MATERIAL_SOLID: 1] [MATERIAL_AIR: 0] [i: 0]

Я был бы очень признателен за понимание того, почему это происходит, и, если есть четкая причина, как решить проблему.

Спасибо!

-1

Решение

«Недопустимая инструкция» означает, что процессор пытался выполнить инструкцию, которая не понимает. Это может произойти, если вы компилируете свою программу с набором инструкций, который не поддерживается вашим процессором. Сбой в этом месте может указывать на то, что использовалась команда сдвига битов BMI2 (она поддерживается на процессорах, которые также поддерживают AVX2). Пожалуйста, проверьте параметры компиляции.

Другая возможность состоит в том, что ваша программа перезаписала часть своего кода. Он расположен не в стеке, а в другой области памяти, так что все будет очень запутано. Я подозреваю, что это не тот случай.

Это может также быть вызвано перегревом или некоторой ошибкой процессора, но эти причины, скорее всего, и здесь могут быть исключены. То же самое для возможной ошибки в компиляторе.

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector