google / highway

Performance-portable, length-agnostic SIMD with runtime dispatch
Apache License 2.0
4.12k stars 315 forks source link

convert most of core to header only #2138

Open boxerab opened 5 months ago

boxerab commented 5 months ago

if per_target.cc becomes header only, then library cannot be built as there are no longer any .cc files

Here is the error:

CMake Error: Cannot determine link language for target "hwy".
CMake Error: CMake can not determine linker language for target: hwy
CMake Error in CMakeLists.txt:
  Exporting the target "hwy" is not allowed since its linker language cannot
  be determined

Even with current commit, we get errors in tests:


/home//src/highway/hwy/tests/mask_mem_test.cc:35:8: error: redefinition of ‘struct hwy::N_EMU128::TestMaskedLoad’
   35 | struct TestMaskedLoad {
      |        ^~~~~~~~~~~~~~
In file included from /home//src/highway/hwy/foreach_target.h:316,
                 from /home//src/highway/hwy/tests/mask_mem_test.cc:27:
/home//src/highway/hwy/tests/mask_mem_test.cc:35:8: note: previous definition of ‘struct hwy::N_EMU128::TestMaskedLoad’
   35 | struct TestMaskedLoad {
      |        ^~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:69:19: error: redefinition of ‘void hwy::N_EMU128::TestAllMaskedLoad()’
   69 | HWY_NOINLINE void TestAllMaskedLoad() {
      |                   ^~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:69:19: note: ‘void hwy::N_EMU128::TestAllMaskedLoad()’ previously defined here
   69 | HWY_NOINLINE void TestAllMaskedLoad() {
      |                   ^~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:73:8: error: redefinition of ‘struct hwy::N_EMU128::TestMaskedScatter’
   73 | struct TestMaskedScatter {
      |        ^~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:73:8: note: previous definition of ‘struct hwy::N_EMU128::TestMaskedScatter’
   73 | struct TestMaskedScatter {
      |        ^~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:111:19: error: redefinition of ‘void hwy::N_EMU128::TestAllMaskedScatter()’
  111 | HWY_NOINLINE void TestAllMaskedScatter() {
      |                   ^~~~~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:111:19: note: ‘void hwy::N_EMU128::TestAllMaskedScatter()’ previously defined here
  111 | HWY_NOINLINE void TestAllMaskedScatter() {
      |                   ^~~~~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:115:8: error: redefinition of ‘struct hwy::N_EMU128::TestScatterIndexN’
  115 | struct TestScatterIndexN {
      |        ^~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:115:8: note: previous definition of ‘struct hwy::N_EMU128::TestScatterIndexN’
  115 | struct TestScatterIndexN {
      |        ^~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:167:19: error: redefinition of ‘void hwy::N_EMU128::TestAllScatterIndexN()’
  167 | HWY_NOINLINE void TestAllScatterIndexN() {
      |                   ^~~~~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:167:19: note: ‘void hwy::N_EMU128::TestAllScatterIndexN()’ previously defined here
  167 | HWY_NOINLINE void TestAllScatterIndexN() {
      |                   ^~~~~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:171:8: error: redefinition of ‘struct hwy::N_EMU128::TestMaskedGather’
  171 | struct TestMaskedGather {
      |        ^~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:171:8: note: previous definition of ‘struct hwy::N_EMU128::TestMaskedGather’
  171 | struct TestMaskedGather {
      |        ^~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:210:19: error: redefinition of ‘void hwy::N_EMU128::TestAllMaskedGather()’
  210 | HWY_NOINLINE void TestAllMaskedGather() {
      |                   ^~~~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:210:19: note: ‘void hwy::N_EMU128::TestAllMaskedGather()’ previously defined here
  210 | HWY_NOINLINE void TestAllMaskedGather() {
      |                   ^~~~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:214:8: error: redefinition of ‘struct hwy::N_EMU128::TestGatherIndexN’
  214 | struct TestGatherIndexN {
      |        ^~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:214:8: note: previous definition of ‘struct hwy::N_EMU128::TestGatherIndexN’
  214 | struct TestGatherIndexN {
      |        ^~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:258:19: error: redefinition of ‘void hwy::N_EMU128::TestAllGatherIndexN()’
  258 | HWY_NOINLINE void TestAllGatherIndexN() {
      |                   ^~~~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:258:19: note: ‘void hwy::N_EMU128::TestAllGatherIndexN()’ previously defined here
  258 | HWY_NOINLINE void TestAllGatherIndexN() {
      |                   ^~~~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:262:8: error: redefinition of ‘struct hwy::N_EMU128::TestBlendedStore’
  262 | struct TestBlendedStore {
      |        ^~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:262:8: note: previous definition of ‘struct hwy::N_EMU128::TestBlendedStore’
  262 | struct TestBlendedStore {
      |        ^~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:293:19: error: redefinition of ‘void hwy::N_EMU128::TestAllBlendedStore()’
  293 | HWY_NOINLINE void TestAllBlendedStore() {
      |                   ^~~~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:293:19: note: ‘void hwy::N_EMU128::TestAllBlendedStore()’ previously defined here
  293 | HWY_NOINLINE void TestAllBlendedStore() {
      |                   ^~~~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:297:7: error: redefinition of ‘class hwy::N_EMU128::TestStoreMaskBits’
  297 | class TestStoreMaskBits {
      |       ^~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:297:7: note: previous definition of ‘class hwy::N_EMU128::TestStoreMaskBits’
  297 | class TestStoreMaskBits {
      |       ^~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:377:19: error: redefinition of ‘void hwy::N_EMU128::TestAllStoreMaskBits()’
  377 | HWY_NOINLINE void TestAllStoreMaskBits() {
      |                   ^~~~~~~~~~~~~~~~~~~~
/home//src/highway/hwy/tests/mask_mem_test.cc:377:19: note: ‘void hwy::N_EMU128::TestAllStoreMaskBits()’ previously defined here
  377 | HWY_NOINLINE void TestAllStoreMaskBits() {
      |                   ^~~~~~~~~~~~~~~~~~~~
In file included from /home//src/highway/hwy/targets.cc:23,
                 from /home//src/highway/hwy/targets.h:345,
                 from /home//src/highway/hwy/highway.h:22,
                 from /home//src/highway/hwy/timer-inl.h:26,
                 from /home//src/highway/hwy/timer.cc:25,
                 from /home//src/highway/hwy/timer.h:67,
                 from /home//src/highway/hwy/nanobenchmark.h:52,
                 from /home//src/highway/hwy/tests/mask_mem_test.cc:23:
/home//src/highway/hwy/highway.h:226:38: error: ‘N_SSSE3’ has not been declared