aff3ct/MIPP

Question: mipp::set<1> (NO_INTRINSICS) is undefined

SpaceView opened this issue · 0 comments

In MIPP\tests\src\bitwise_operations\xorb.cpp, I was trying to test this function,


template <typename T>
void test_msk_xorb()
{
	constexpr int N = mipp::N<T>();
	bool inputs1[N], inputs2[N];
	std::mt19937 g;
	std::uniform_int_distribution<uint16_t> dis(0, 1);

	for (auto t = 0; t < 100; t++)
	{
		for (auto i = 0; i < N; i++)
		{
			inputs1[i] = dis(g) ? true : false;
			inputs2[i] = dis(g) ? true : false;
		}

		std::shuffle(inputs1, inputs1 + mipp::N<T>(), g);
		std::shuffle(inputs2, inputs2 + mipp::N<T>(), g);

		mipp::msk m1 = mipp::set<N>(inputs1);
		mipp::msk m2 = mipp::set<N>(inputs2);
		mipp::msk m3 = mipp::xorb<N>(m1, m2);

		mipp::reg r = mipp::toreg<N>(m3);

		for (auto i = 0; i < N; i++)
		{
			bool res = inputs1[i] ^ inputs2[i];

			if (res)
				REQUIRE(mipp::get<T>(r, i) != (T)0);
			else
				REQUIRE(mipp::get<T>(r, i) == (T)res);
		}
	}
}

So I add a few lines into the test line,

TEST_CASE("Binary xor - mipp::Msk", "[mipp::xorb]")
{
#if defined(MIPP_64BIT)
	SECTION("datatype = int64_t") { test_Msk_xorb<int64_t>(); }
#endif
	SECTION("datatype = int32_t") { test_Msk_xorb<int32_t>(); }
#if defined(MIPP_BW)
	SECTION("datatype = int16_t") { test_Msk_xorb<int16_t>(); }
	SECTION("datatype = int8_t") { test_Msk_xorb<int8_t>(); }
#endif

#if defined(MIPP_64BIT)
	SECTION("datatype = int64_t") { test_msk_xorb<int64_t>(); }
#endif
	SECTION("datatype = int32_t") { test_msk_xorb<int32_t>(); }
#if defined(MIPP_BW)
	SECTION("datatype = int16_t") { test_msk_xorb<int16_t>(); }
	SECTION("datatype = int8_t") { test_msk_xorb<int8_t>(); }
#endif
}

However I got the following error info at runtime,

MIPP tests
----------

Instr. type:       NO
Instr. full type:  NO_INTRINSICS
Instr. version:    1
Instr. size:       0 bits
Instr. lanes:      1
64-bit support:    yes
Byte/word support: yes


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
run_tests.exe is a Catch v2.2.2 host application.
Run with -? for options

-------------------------------------------------------------------------------
Binary xor - mipp::Msk
  datatype = int64_t
-------------------------------------------------------------------------------
E:\vLIBS\MIPP\tests\src\bitwise_operations\xorb.cpp(174)
...............................................................................

E:\vLIBS\MIPP\tests\src\bitwise_operations\xorb.cpp(174): FAILED:
due to unexpected exception with message:
  mipp::set<1> (NO_INTRINSICS) is undefined!, try to add -mfpu=neon-vfpv4, -
  msse4.2, -mavx, -march=native... at the compile time.

-------------------------------------------------------------------------------
Binary xor - mipp::Msk
  datatype = int32_t
-------------------------------------------------------------------------------
E:\vLIBS\MIPP\tests\src\bitwise_operations\xorb.cpp(176)
...............................................................................

E:\vLIBS\MIPP\tests\src\bitwise_operations\xorb.cpp(176): FAILED:
due to unexpected exception with message:
  mipp::set<1> (NO_INTRINSICS) is undefined!, try to add -mfpu=neon-vfpv4, -
  msse4.2, -mavx, -march=native... at the compile time.

-------------------------------------------------------------------------------
Binary xor - mipp::Msk
  datatype = int16_t
-------------------------------------------------------------------------------
E:\vLIBS\MIPP\tests\src\bitwise_operations\xorb.cpp(178)
...............................................................................

E:\vLIBS\MIPP\tests\src\bitwise_operations\xorb.cpp(178): FAILED:
due to unexpected exception with message:
  mipp::set<1> (NO_INTRINSICS) is undefined!, try to add -mfpu=neon-vfpv4, -
  msse4.2, -mavx, -march=native... at the compile time.

-------------------------------------------------------------------------------
Binary xor - mipp::Msk
  datatype = int8_t
-------------------------------------------------------------------------------
E:\vLIBS\MIPP\tests\src\bitwise_operations\xorb.cpp(179)
...............................................................................

E:\vLIBS\MIPP\tests\src\bitwise_operations\xorb.cpp(179): FAILED:
due to unexpected exception with message:
  mipp::set<1> (NO_INTRINSICS) is undefined!, try to add -mfpu=neon-vfpv4, -
  msse4.2, -mavx, -march=native... at the compile time.

===============================================================================
test cases:   123 |   122 passed | 1 failed
assertions: 10353 | 10349 passed | 4 failed

It seems mipp::set<1> is not defined, but in mipp.h I can clearly see that the set function is defined as,

template <typename T> inline reg   set          (const T[nElReg<T>()])            { errorMessage<T>("set");           exit(-1); }
#ifdef _MSC_VER
template <int      N> inline msk   set          (const bool[])                    { errorMessage<N>("set");           exit(-1); }
#else
template <int      N> inline msk   set          (const bool[N])                   { errorMessage<N>("set");           exit(-1); }
#endif

I add the command "-mfpu=neon-vfpv4" to msvc2019 compiler, it seems doesn't help at all.
Could anybody give some explanation about this?