Копирование -nan для float и AVX __m256 показывает 0 после копирования - PullRequest
1 голос
/ 26 января 2020

У меня есть две следующие ситуации, которые для меня должны быть похожими, но, по-видимому, нет.

Эта не работает, хотя это было бы более идеальным:

static union { __m256 trueMask8; float trueMask[8]; };
void Init()
{
   trueMask8 = _mm256_cmp_ps(_mm256_setzero_ps(), _mm256_setzero_ps(), _CMP_EQ_OS);
}

class Ray8
{
   union { __m256 activeMask8; float deadMask[8]; };

   Ray8()
   {
      activeMask8 = trueMask8;
      int w = 0; //breakpoint
   }
}

Проблема с вышеупомянутым состоит в том, что activeMask8 показывает все 0 на точке останова, в то время как trueMask8 показывает все -nan, поэтому я уверен, что Init был вызван. каждый раз, когда мне нужна настоящая маска, мне нужно вызывать сравнение:

class Ray8
{
   union { __m256 activeMask8; float deadMask[8]; };

   Ray8()
   {
      activeMask8 = _mm256_cmp_ps(_mm256_setzero_ps(), _mm256_setzero_ps(), _CMP_EQ_OS);
       int w = 0; //breakpoint
   }
}

Здесь все в activeMask8 равно -1 в точке останова.

То же самое касается:

activeMask[0] = trueMask[0];

Это два числа с плавающей точкой. trueMask [0] показывает -nan, тогда как activeMask [0] впоследствии показывает 0.

Почему это происходит? Обычно я пытаюсь создать конструктор копирования, но _m256 - это тип библиотеки. Есть ли решение для этого?

1 Ответ

0 голосов
/ 26 января 2020

Так или иначе, это связано с тем, что trueMask8 имеет значение true. Я до сих пор не могу воспроизвести его в консольной программе, но я обнаружил следующее:

Я сохраняю trueMask глобальным в моем файле ray.h в обоих случаях.

Если я установил trueMask в Мой конструктор Ray8 () перед копированием его в activeMask8, он работает и продолжает это делать в остальной части моей программы.

Если я установлю trueMask в Init или конструкторе, который не является конструктором Ray8 (), он не будет работать. Я не могу воспроизвести это в консольной программе, поэтому я до сих пор не знаю, что вызывает это. Но сейчас это решение - просто выполнить его для каждого Ray8, который я делаю.

...