netgen-mesher 6.2.2506.post35.dev0__cp314-cp314-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. netgen/NgOCC.py +7 -0
  2. netgen/__init__.py +114 -0
  3. netgen/__init__.pyi +22 -0
  4. netgen/__main__.py +53 -0
  5. netgen/cmake/NetgenConfig.cmake +79 -0
  6. netgen/cmake/netgen-targets-release.cmake +69 -0
  7. netgen/cmake/netgen-targets.cmake +146 -0
  8. netgen/config/__init__.py +1 -0
  9. netgen/config/__init__.pyi +52 -0
  10. netgen/config/__main__.py +4 -0
  11. netgen/config/config.py +68 -0
  12. netgen/config/config.pyi +54 -0
  13. netgen/csg.py +25 -0
  14. netgen/geom2d.py +178 -0
  15. netgen/gui.py +82 -0
  16. netgen/include/core/archive.hpp +1256 -0
  17. netgen/include/core/array.hpp +1760 -0
  18. netgen/include/core/autodiff.hpp +1131 -0
  19. netgen/include/core/autodiffdiff.hpp +733 -0
  20. netgen/include/core/bitarray.hpp +240 -0
  21. netgen/include/core/concurrentqueue.h +3619 -0
  22. netgen/include/core/exception.hpp +145 -0
  23. netgen/include/core/flags.hpp +199 -0
  24. netgen/include/core/hashtable.hpp +1281 -0
  25. netgen/include/core/localheap.hpp +318 -0
  26. netgen/include/core/logging.hpp +117 -0
  27. netgen/include/core/memtracer.hpp +221 -0
  28. netgen/include/core/mpi4py_pycapi.h +245 -0
  29. netgen/include/core/mpi_wrapper.hpp +643 -0
  30. netgen/include/core/ng_mpi.hpp +94 -0
  31. netgen/include/core/ng_mpi_generated_declarations.hpp +155 -0
  32. netgen/include/core/ng_mpi_native.hpp +25 -0
  33. netgen/include/core/ngcore.hpp +32 -0
  34. netgen/include/core/ngcore_api.hpp +152 -0
  35. netgen/include/core/ngstream.hpp +115 -0
  36. netgen/include/core/paje_trace.hpp +279 -0
  37. netgen/include/core/profiler.hpp +382 -0
  38. netgen/include/core/python_ngcore.hpp +457 -0
  39. netgen/include/core/ranges.hpp +109 -0
  40. netgen/include/core/register_archive.hpp +100 -0
  41. netgen/include/core/signal.hpp +82 -0
  42. netgen/include/core/simd.hpp +160 -0
  43. netgen/include/core/simd_arm64.hpp +407 -0
  44. netgen/include/core/simd_avx.hpp +394 -0
  45. netgen/include/core/simd_avx512.hpp +285 -0
  46. netgen/include/core/simd_generic.hpp +1053 -0
  47. netgen/include/core/simd_math.hpp +178 -0
  48. netgen/include/core/simd_sse.hpp +289 -0
  49. netgen/include/core/statushandler.hpp +37 -0
  50. netgen/include/core/symboltable.hpp +153 -0
  51. netgen/include/core/table.hpp +810 -0
  52. netgen/include/core/taskmanager.hpp +1161 -0
  53. netgen/include/core/type_traits.hpp +65 -0
  54. netgen/include/core/utils.hpp +385 -0
  55. netgen/include/core/version.hpp +102 -0
  56. netgen/include/core/xbool.hpp +47 -0
  57. netgen/include/csg/algprim.hpp +563 -0
  58. netgen/include/csg/brick.hpp +150 -0
  59. netgen/include/csg/csg.hpp +43 -0
  60. netgen/include/csg/csgeom.hpp +389 -0
  61. netgen/include/csg/csgparser.hpp +101 -0
  62. netgen/include/csg/curve2d.hpp +67 -0
  63. netgen/include/csg/edgeflw.hpp +112 -0
  64. netgen/include/csg/explicitcurve2d.hpp +113 -0
  65. netgen/include/csg/extrusion.hpp +185 -0
  66. netgen/include/csg/gencyl.hpp +70 -0
  67. netgen/include/csg/geoml.hpp +16 -0
  68. netgen/include/csg/identify.hpp +213 -0
  69. netgen/include/csg/manifold.hpp +29 -0
  70. netgen/include/csg/meshsurf.hpp +46 -0
  71. netgen/include/csg/polyhedra.hpp +121 -0
  72. netgen/include/csg/revolution.hpp +180 -0
  73. netgen/include/csg/singularref.hpp +84 -0
  74. netgen/include/csg/solid.hpp +295 -0
  75. netgen/include/csg/specpoin.hpp +194 -0
  76. netgen/include/csg/spline3d.hpp +99 -0
  77. netgen/include/csg/splinesurface.hpp +85 -0
  78. netgen/include/csg/surface.hpp +394 -0
  79. netgen/include/csg/triapprox.hpp +63 -0
  80. netgen/include/csg/vscsg.hpp +34 -0
  81. netgen/include/general/autodiff.hpp +356 -0
  82. netgen/include/general/autoptr.hpp +39 -0
  83. netgen/include/general/gzstream.h +121 -0
  84. netgen/include/general/hashtabl.hpp +1692 -0
  85. netgen/include/general/myadt.hpp +48 -0
  86. netgen/include/general/mystring.hpp +226 -0
  87. netgen/include/general/netgenout.hpp +205 -0
  88. netgen/include/general/ngarray.hpp +797 -0
  89. netgen/include/general/ngbitarray.hpp +149 -0
  90. netgen/include/general/ngpython.hpp +74 -0
  91. netgen/include/general/optmem.hpp +44 -0
  92. netgen/include/general/parthreads.hpp +138 -0
  93. netgen/include/general/seti.hpp +50 -0
  94. netgen/include/general/sort.hpp +47 -0
  95. netgen/include/general/spbita2d.hpp +59 -0
  96. netgen/include/general/stack.hpp +114 -0
  97. netgen/include/general/table.hpp +280 -0
  98. netgen/include/general/template.hpp +509 -0
  99. netgen/include/geom2d/csg2d.hpp +750 -0
  100. netgen/include/geom2d/geometry2d.hpp +280 -0
  101. netgen/include/geom2d/spline2d.hpp +234 -0
  102. netgen/include/geom2d/vsgeom2d.hpp +28 -0
  103. netgen/include/gprim/adtree.hpp +1392 -0
  104. netgen/include/gprim/geom2d.hpp +858 -0
  105. netgen/include/gprim/geom3d.hpp +749 -0
  106. netgen/include/gprim/geomfuncs.hpp +212 -0
  107. netgen/include/gprim/geomobjects.hpp +544 -0
  108. netgen/include/gprim/geomops.hpp +404 -0
  109. netgen/include/gprim/geomtest3d.hpp +101 -0
  110. netgen/include/gprim/gprim.hpp +33 -0
  111. netgen/include/gprim/spline.hpp +778 -0
  112. netgen/include/gprim/splinegeometry.hpp +73 -0
  113. netgen/include/gprim/transform3d.hpp +216 -0
  114. netgen/include/include/acisgeom.hpp +3 -0
  115. netgen/include/include/csg.hpp +1 -0
  116. netgen/include/include/geometry2d.hpp +1 -0
  117. netgen/include/include/gprim.hpp +1 -0
  118. netgen/include/include/incopengl.hpp +62 -0
  119. netgen/include/include/inctcl.hpp +13 -0
  120. netgen/include/include/incvis.hpp +6 -0
  121. netgen/include/include/linalg.hpp +1 -0
  122. netgen/include/include/meshing.hpp +1 -0
  123. netgen/include/include/myadt.hpp +1 -0
  124. netgen/include/include/mydefs.hpp +70 -0
  125. netgen/include/include/mystdlib.h +59 -0
  126. netgen/include/include/netgen_config.hpp +27 -0
  127. netgen/include/include/netgen_version.hpp +9 -0
  128. netgen/include/include/nginterface_v2_impl.hpp +395 -0
  129. netgen/include/include/ngsimd.hpp +1 -0
  130. netgen/include/include/occgeom.hpp +1 -0
  131. netgen/include/include/opti.hpp +1 -0
  132. netgen/include/include/parallel.hpp +1 -0
  133. netgen/include/include/stlgeom.hpp +1 -0
  134. netgen/include/include/visual.hpp +1 -0
  135. netgen/include/interface/rw_medit.hpp +11 -0
  136. netgen/include/interface/writeuser.hpp +80 -0
  137. netgen/include/linalg/densemat.hpp +414 -0
  138. netgen/include/linalg/linalg.hpp +29 -0
  139. netgen/include/linalg/opti.hpp +142 -0
  140. netgen/include/linalg/polynomial.hpp +47 -0
  141. netgen/include/linalg/vector.hpp +217 -0
  142. netgen/include/meshing/adfront2.hpp +274 -0
  143. netgen/include/meshing/adfront3.hpp +332 -0
  144. netgen/include/meshing/basegeom.hpp +370 -0
  145. netgen/include/meshing/bcfunctions.hpp +53 -0
  146. netgen/include/meshing/bisect.hpp +72 -0
  147. netgen/include/meshing/boundarylayer.hpp +113 -0
  148. netgen/include/meshing/classifyhpel.hpp +1984 -0
  149. netgen/include/meshing/clusters.hpp +46 -0
  150. netgen/include/meshing/curvedelems.hpp +274 -0
  151. netgen/include/meshing/delaunay2d.hpp +73 -0
  152. netgen/include/meshing/fieldlines.hpp +103 -0
  153. netgen/include/meshing/findip.hpp +198 -0
  154. netgen/include/meshing/findip2.hpp +103 -0
  155. netgen/include/meshing/geomsearch.hpp +69 -0
  156. netgen/include/meshing/global.hpp +54 -0
  157. netgen/include/meshing/hpref_hex.hpp +330 -0
  158. netgen/include/meshing/hpref_prism.hpp +3405 -0
  159. netgen/include/meshing/hpref_pyramid.hpp +154 -0
  160. netgen/include/meshing/hpref_quad.hpp +2082 -0
  161. netgen/include/meshing/hpref_segm.hpp +122 -0
  162. netgen/include/meshing/hpref_tet.hpp +4230 -0
  163. netgen/include/meshing/hpref_trig.hpp +848 -0
  164. netgen/include/meshing/hprefinement.hpp +366 -0
  165. netgen/include/meshing/improve2.hpp +178 -0
  166. netgen/include/meshing/improve3.hpp +151 -0
  167. netgen/include/meshing/localh.hpp +223 -0
  168. netgen/include/meshing/meshclass.hpp +1076 -0
  169. netgen/include/meshing/meshfunc.hpp +47 -0
  170. netgen/include/meshing/meshing.hpp +63 -0
  171. netgen/include/meshing/meshing2.hpp +163 -0
  172. netgen/include/meshing/meshing3.hpp +123 -0
  173. netgen/include/meshing/meshtool.hpp +90 -0
  174. netgen/include/meshing/meshtype.hpp +1930 -0
  175. netgen/include/meshing/msghandler.hpp +62 -0
  176. netgen/include/meshing/paralleltop.hpp +172 -0
  177. netgen/include/meshing/python_mesh.hpp +206 -0
  178. netgen/include/meshing/ruler2.hpp +172 -0
  179. netgen/include/meshing/ruler3.hpp +211 -0
  180. netgen/include/meshing/soldata.hpp +141 -0
  181. netgen/include/meshing/specials.hpp +17 -0
  182. netgen/include/meshing/surfacegeom.hpp +73 -0
  183. netgen/include/meshing/topology.hpp +1003 -0
  184. netgen/include/meshing/validate.hpp +21 -0
  185. netgen/include/meshing/visual_interface.hpp +71 -0
  186. netgen/include/mydefs.hpp +70 -0
  187. netgen/include/nginterface.h +474 -0
  188. netgen/include/nginterface_v2.hpp +406 -0
  189. netgen/include/nglib.h +697 -0
  190. netgen/include/nglib_occ.h +50 -0
  191. netgen/include/occ/occ_edge.hpp +47 -0
  192. netgen/include/occ/occ_face.hpp +52 -0
  193. netgen/include/occ/occ_solid.hpp +23 -0
  194. netgen/include/occ/occ_utils.hpp +376 -0
  195. netgen/include/occ/occ_vertex.hpp +30 -0
  196. netgen/include/occ/occgeom.hpp +659 -0
  197. netgen/include/occ/occmeshsurf.hpp +168 -0
  198. netgen/include/occ/vsocc.hpp +33 -0
  199. netgen/include/pybind11/LICENSE +29 -0
  200. netgen/include/pybind11/attr.h +722 -0
  201. netgen/include/pybind11/buffer_info.h +208 -0
  202. netgen/include/pybind11/cast.h +2361 -0
  203. netgen/include/pybind11/chrono.h +228 -0
  204. netgen/include/pybind11/common.h +2 -0
  205. netgen/include/pybind11/complex.h +74 -0
  206. netgen/include/pybind11/conduit/README.txt +15 -0
  207. netgen/include/pybind11/conduit/pybind11_conduit_v1.h +116 -0
  208. netgen/include/pybind11/conduit/pybind11_platform_abi_id.h +87 -0
  209. netgen/include/pybind11/conduit/wrap_include_python_h.h +72 -0
  210. netgen/include/pybind11/critical_section.h +56 -0
  211. netgen/include/pybind11/detail/class.h +823 -0
  212. netgen/include/pybind11/detail/common.h +1348 -0
  213. netgen/include/pybind11/detail/cpp_conduit.h +75 -0
  214. netgen/include/pybind11/detail/descr.h +226 -0
  215. netgen/include/pybind11/detail/dynamic_raw_ptr_cast_if_possible.h +39 -0
  216. netgen/include/pybind11/detail/exception_translation.h +71 -0
  217. netgen/include/pybind11/detail/function_record_pyobject.h +191 -0
  218. netgen/include/pybind11/detail/init.h +538 -0
  219. netgen/include/pybind11/detail/internals.h +799 -0
  220. netgen/include/pybind11/detail/native_enum_data.h +209 -0
  221. netgen/include/pybind11/detail/pybind11_namespace_macros.h +82 -0
  222. netgen/include/pybind11/detail/struct_smart_holder.h +378 -0
  223. netgen/include/pybind11/detail/type_caster_base.h +1591 -0
  224. netgen/include/pybind11/detail/typeid.h +65 -0
  225. netgen/include/pybind11/detail/using_smart_holder.h +22 -0
  226. netgen/include/pybind11/detail/value_and_holder.h +90 -0
  227. netgen/include/pybind11/eigen/common.h +9 -0
  228. netgen/include/pybind11/eigen/matrix.h +723 -0
  229. netgen/include/pybind11/eigen/tensor.h +521 -0
  230. netgen/include/pybind11/eigen.h +12 -0
  231. netgen/include/pybind11/embed.h +320 -0
  232. netgen/include/pybind11/eval.h +161 -0
  233. netgen/include/pybind11/functional.h +147 -0
  234. netgen/include/pybind11/gil.h +199 -0
  235. netgen/include/pybind11/gil_safe_call_once.h +102 -0
  236. netgen/include/pybind11/gil_simple.h +37 -0
  237. netgen/include/pybind11/iostream.h +265 -0
  238. netgen/include/pybind11/native_enum.h +67 -0
  239. netgen/include/pybind11/numpy.h +2312 -0
  240. netgen/include/pybind11/operators.h +202 -0
  241. netgen/include/pybind11/options.h +92 -0
  242. netgen/include/pybind11/pybind11.h +3645 -0
  243. netgen/include/pybind11/pytypes.h +2680 -0
  244. netgen/include/pybind11/stl/filesystem.h +114 -0
  245. netgen/include/pybind11/stl.h +666 -0
  246. netgen/include/pybind11/stl_bind.h +858 -0
  247. netgen/include/pybind11/subinterpreter.h +299 -0
  248. netgen/include/pybind11/trampoline_self_life_support.h +65 -0
  249. netgen/include/pybind11/type_caster_pyobject_ptr.h +61 -0
  250. netgen/include/pybind11/typing.h +298 -0
  251. netgen/include/pybind11/warnings.h +75 -0
  252. netgen/include/stlgeom/meshstlsurface.hpp +67 -0
  253. netgen/include/stlgeom/stlgeom.hpp +491 -0
  254. netgen/include/stlgeom/stlline.hpp +193 -0
  255. netgen/include/stlgeom/stltool.hpp +331 -0
  256. netgen/include/stlgeom/stltopology.hpp +419 -0
  257. netgen/include/stlgeom/vsstl.hpp +58 -0
  258. netgen/include/visualization/meshdoc.hpp +42 -0
  259. netgen/include/visualization/mvdraw.hpp +325 -0
  260. netgen/include/visualization/vispar.hpp +128 -0
  261. netgen/include/visualization/visual.hpp +28 -0
  262. netgen/include/visualization/visual_api.hpp +10 -0
  263. netgen/include/visualization/vssolution.hpp +399 -0
  264. netgen/lib/libnggui.lib +0 -0
  265. netgen/lib/ngcore.lib +0 -0
  266. netgen/lib/nglib.lib +0 -0
  267. netgen/lib/togl.lib +0 -0
  268. netgen/libnggui.dll +0 -0
  269. netgen/libngguipy.lib +0 -0
  270. netgen/libngguipy.pyd +0 -0
  271. netgen/libngpy/_NgOCC.pyi +1545 -0
  272. netgen/libngpy/__init__.pyi +7 -0
  273. netgen/libngpy/_csg.pyi +259 -0
  274. netgen/libngpy/_geom2d.pyi +323 -0
  275. netgen/libngpy/_meshing.pyi +1111 -0
  276. netgen/libngpy/_stl.pyi +131 -0
  277. netgen/libngpy.lib +0 -0
  278. netgen/libngpy.pyd +0 -0
  279. netgen/meshing.py +65 -0
  280. netgen/ngcore.dll +0 -0
  281. netgen/nglib.dll +0 -0
  282. netgen/occ.py +52 -0
  283. netgen/read_gmsh.py +259 -0
  284. netgen/read_meshio.py +22 -0
  285. netgen/stl.py +2 -0
  286. netgen/togl.dll +0 -0
  287. netgen/version.py +2 -0
  288. netgen/webgui.py +529 -0
  289. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boundarycondition.geo +16 -0
  290. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/boxcyl.geo +32 -0
  291. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/circle_on_cube.geo +27 -0
  292. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cone.geo +13 -0
  293. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cube.geo +16 -0
  294. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandring.geo +55 -0
  295. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubeandspheres.geo +21 -0
  296. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemcyl.geo +18 -0
  297. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cubemsphere.geo +19 -0
  298. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylinder.geo +12 -0
  299. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/cylsphere.geo +12 -0
  300. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/doc/ng4.pdf +0 -0
  301. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipsoid.geo +8 -0
  302. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ellipticcyl.geo +10 -0
  303. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/extrusion.geo +99 -0
  304. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/fichera.geo +24 -0
  305. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/frame.step +11683 -0
  306. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/hinge.stl +8486 -0
  307. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/lshape3d.geo +26 -0
  308. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes.geo +26 -0
  309. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/manyholes2.geo +26 -0
  310. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/matrix.geo +27 -0
  311. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/ortho.geo +11 -0
  312. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/part1.stl +2662 -0
  313. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/period.geo +33 -0
  314. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/exportNeutral.py +26 -0
  315. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/mesh.py +19 -0
  316. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/py_tutorials/shaft.geo +65 -0
  317. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/revolution.geo +18 -0
  318. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/screw.step +1694 -0
  319. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sculpture.geo +13 -0
  320. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shaft.geo +65 -0
  321. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/shell.geo +10 -0
  322. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphere.geo +8 -0
  323. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/sphereincube.geo +17 -0
  324. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/square.in2d +35 -0
  325. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarecircle.in2d +48 -0
  326. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/squarehole.in2d +47 -0
  327. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/torus.geo +8 -0
  328. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/trafo.geo +57 -0
  329. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twobricks.geo +15 -0
  330. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocubes.geo +18 -0
  331. netgen_mesher-6.2.2506.post35.dev0.data/data/share/netgen/twocyl.geo +16 -0
  332. netgen_mesher-6.2.2506.post35.dev0.dist-info/METADATA +15 -0
  333. netgen_mesher-6.2.2506.post35.dev0.dist-info/RECORD +340 -0
  334. netgen_mesher-6.2.2506.post35.dev0.dist-info/WHEEL +5 -0
  335. netgen_mesher-6.2.2506.post35.dev0.dist-info/entry_points.txt +2 -0
  336. netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/AUTHORS +1 -0
  337. netgen_mesher-6.2.2506.post35.dev0.dist-info/licenses/LICENSE +504 -0
  338. netgen_mesher-6.2.2506.post35.dev0.dist-info/top_level.txt +2 -0
  339. pyngcore/__init__.py +1 -0
  340. pyngcore/pyngcore.cp314-win_amd64.pyd +0 -0
@@ -0,0 +1,394 @@
1
+ #ifndef NETGEN_CORE_SIMD_AVX_HPP
2
+ #define NETGEN_CORE_SIMD_AVX_HPP
3
+
4
+ /**************************************************************************/
5
+ /* File: simd_avx.hpp */
6
+ /* Author: Joachim Schoeberl, Matthias Hochsteger */
7
+ /* Date: 25. Mar. 16 */
8
+ /**************************************************************************/
9
+
10
+ #include <immintrin.h>
11
+
12
+ namespace ngcore
13
+ {
14
+
15
+ #if defined(__GNUC__) && (__GNUC__ == 7)
16
+ // GCC7 does not have intrinsic _mm256_set_m128i, see
17
+ // https://stackoverflow.com/questions/32630458/setting-m256i-to-the-value-of-two-m128i-values
18
+ NETGEN_INLINE auto _mm256_set_m128i(__m128i v0, __m128i v1) {
19
+ return _mm256_insertf128_si256(_mm256_castsi128_si256(v1), (v0), 1);
20
+ }
21
+ #endif // defined(__GNUC__) && (__GNUC__ == 7)
22
+
23
+ #if defined(__AVX2__)
24
+ NETGEN_INLINE __m256i my_mm256_cmpeq_epi64 (__m256i a, __m256i b)
25
+ {
26
+ return _mm256_cmpeq_epi64 (a,b);
27
+ }
28
+
29
+ NETGEN_INLINE __m256i my_mm256_cmpgt_epi64 (__m256i a, __m256i b)
30
+ {
31
+ return _mm256_cmpgt_epi64 (a,b);
32
+ }
33
+
34
+ NETGEN_INLINE __m256i my_mm256_cvtepi32_epi64 (__m128i a)
35
+ {
36
+ return _mm256_cvtepi32_epi64 (a);
37
+ }
38
+
39
+ #else
40
+ NETGEN_INLINE __m256i my_mm256_cmpeq_epi64 (__m256i a, __m256i b)
41
+ {
42
+ __m128i rlo = _mm_cmpeq_epi64(_mm256_extractf128_si256(a, 0),
43
+ _mm256_extractf128_si256(b, 0));
44
+ __m128i rhi = _mm_cmpeq_epi64(_mm256_extractf128_si256(a, 1),
45
+ _mm256_extractf128_si256(b, 1));
46
+ return _mm256_insertf128_si256 (_mm256_castsi128_si256(rlo), rhi, 1);
47
+ }
48
+
49
+ NETGEN_INLINE __m256i my_mm256_cmpgt_epi64 (__m256i a, __m256i b)
50
+ {
51
+ __m128i rlo = _mm_cmpgt_epi64(_mm256_extractf128_si256(a, 0),
52
+ _mm256_extractf128_si256(b, 0));
53
+ __m128i rhi = _mm_cmpgt_epi64(_mm256_extractf128_si256(a, 1),
54
+ _mm256_extractf128_si256(b, 1));
55
+ return _mm256_insertf128_si256 (_mm256_castsi128_si256(rlo), rhi, 1);
56
+ }
57
+
58
+ NETGEN_INLINE __m256i my_mm256_cvtepi32_epi64 (__m128i a)
59
+ {
60
+ __m128i rlo = _mm_cvtepi32_epi64(a); // First two 32-bit integers
61
+ __m128i rhi = _mm_cvtepi32_epi64(_mm_shuffle_epi32(a, _MM_SHUFFLE(3, 2, 3, 2))); // Next two 32-bit integers
62
+ return _mm256_insertf128_si256 (_mm256_castsi128_si256(rlo), rhi, 1);
63
+ }
64
+ #endif
65
+
66
+
67
+ template <>
68
+ class SIMD<mask64,4>
69
+ {
70
+ __m256i mask;
71
+ public:
72
+ SIMD (int64_t i)
73
+ : mask(my_mm256_cmpgt_epi64(_mm256_set1_epi64x(i),
74
+ _mm256_set_epi64x(3, 2, 1, 0)))
75
+ { ; }
76
+ SIMD (__m256i _mask) : mask(_mask) { ; }
77
+ SIMD (__m256d _mask) : mask(_mm256_castpd_si256(_mask)) { ; }
78
+ __m256i Data() const { return mask; }
79
+ static constexpr int Size() { return 4; }
80
+ static SIMD<mask64, 4> GetMaskFromBits (unsigned int i);
81
+ };
82
+
83
+ static SIMD<mask64, 4> masks_from_4bits[16] = {
84
+ _mm256_set_epi64x (0,0,0,0), _mm256_set_epi64x (0,0,0,-1),
85
+ _mm256_set_epi64x (0,0,-1,0), _mm256_set_epi64x (0,0,-1,-1),
86
+ _mm256_set_epi64x (0,-1,0,0), _mm256_set_epi64x (0,-1,0,-1),
87
+ _mm256_set_epi64x (0,-1,-1,0), _mm256_set_epi64x (0,-1,-1,-1),
88
+ _mm256_set_epi64x (-1,0,0,0), _mm256_set_epi64x (-1,0,0,-1),
89
+ _mm256_set_epi64x (-1,0,-1,0), _mm256_set_epi64x (-1,0,-1,-1),
90
+ _mm256_set_epi64x (-1,-1,0,0), _mm256_set_epi64x (-1,-1,0,-1),
91
+ _mm256_set_epi64x (-1,-1,-1,0), _mm256_set_epi64x (-1,-1,-1,-1)
92
+ };
93
+
94
+ NETGEN_INLINE SIMD<mask64, 4> SIMD<mask64, 4> :: GetMaskFromBits (unsigned int i)
95
+ {
96
+ return masks_from_4bits[i & 15];
97
+ }
98
+
99
+ template<>
100
+ class alignas(32) SIMD<int64_t,4>
101
+ {
102
+ __m256i data;
103
+
104
+ public:
105
+ static constexpr int Size() { return 4; }
106
+ SIMD () {}
107
+ SIMD (const SIMD &) = default;
108
+ SIMD & operator= (const SIMD &) = default;
109
+
110
+ SIMD (int64_t val) { data = _mm256_set1_epi64x(val); }
111
+ SIMD (int64_t v0, int64_t v1, int64_t v2, int64_t v3) { data = _mm256_set_epi64x(v3,v2,v1,v0); }
112
+ SIMD (std::array<int64_t,4> a)
113
+ : data{_mm256_set_epi64x(a[3],a[2],a[1],a[0])}
114
+ {}
115
+ SIMD (SIMD<int64_t,2> v0, SIMD<int64_t,2> v1)
116
+ : data(_mm256_set_m128i(v1.Data(),v0.Data()))
117
+ {}
118
+ SIMD (__m256i _data) { data = _data; }
119
+
120
+ NETGEN_INLINE auto operator[] (int i) const { return ((int64_t*)(&data))[i]; }
121
+ NETGEN_INLINE __m256i Data() const { return data; }
122
+ NETGEN_INLINE __m256i & Data() { return data; }
123
+
124
+ SIMD<int64_t,2> Lo() const { return _mm256_extractf128_si256(data, 0); }
125
+ SIMD<int64_t,2> Hi() const { return _mm256_extractf128_si256(data, 1); }
126
+ static SIMD FirstInt(int n0=0) { return { n0+0, n0+1, n0+2, n0+3 }; }
127
+
128
+ template <int I>
129
+ double Get() const
130
+ {
131
+ static_assert(I>=0 && I<4, "Index out of range");
132
+ return (*this)[I];
133
+ }
134
+ };
135
+
136
+
137
+ NETGEN_INLINE SIMD<int64_t,4> operator-(SIMD<int64_t,4> a) { return _mm256_sub_epi64(_mm256_setzero_si256(), a.Data()); }
138
+
139
+ #ifdef __AVX2__
140
+ NETGEN_INLINE SIMD<int64_t,4> operator+ (SIMD<int64_t,4> a, SIMD<int64_t,4> b) { return _mm256_add_epi64(a.Data(),b.Data()); }
141
+ NETGEN_INLINE SIMD<int64_t,4> operator- (SIMD<int64_t,4> a, SIMD<int64_t,4> b) { return _mm256_sub_epi64(a.Data(),b.Data()); }
142
+ NETGEN_INLINE SIMD<int64_t,4> operator& (SIMD<int64_t,4> a, SIMD<int64_t,4> b)
143
+ { return _mm256_castpd_si256(_mm256_and_pd (_mm256_castsi256_pd(a.Data()),_mm256_castsi256_pd( b.Data()))); }
144
+
145
+ template <int N>
146
+ SIMD<int64_t,4> operator<< (SIMD<int64_t,4> a, IC<N> n) { return _mm256_sll_epi64(a.Data(),_mm_set_epi32(0,0,0,N)); }
147
+ #endif // __AVX2__
148
+
149
+ template<>
150
+ class alignas(32) SIMD<double,4>
151
+ {
152
+ __m256d data;
153
+
154
+ public:
155
+ static constexpr int Size() { return 4; }
156
+ SIMD () {}
157
+ SIMD (const SIMD &) = default;
158
+ SIMD & operator= (const SIMD &) = default;
159
+
160
+ SIMD (double val) { data = _mm256_set1_pd(val); }
161
+ SIMD (int val) { data = _mm256_set1_pd(val); }
162
+ SIMD (size_t val) { data = _mm256_set1_pd(val); }
163
+ SIMD (double v0, double v1, double v2, double v3) { data = _mm256_set_pd(v3,v2,v1,v0); }
164
+ SIMD (SIMD<double,2> v0, SIMD<double,2> v1) : SIMD(v0[0], v0[1], v1[0], v1[1]) { ; }
165
+ SIMD (double const * p) { data = _mm256_loadu_pd(p); }
166
+ SIMD (double const * p, SIMD<mask64,4> mask) { data = _mm256_maskload_pd(p, mask.Data()); }
167
+ SIMD (__m256d _data) { data = _data; }
168
+ SIMD (std::array<double,4> a)
169
+ : data{_mm256_set_pd(a[3],a[2],a[1],a[0])}
170
+ {}
171
+
172
+ void Store (double * p) { _mm256_storeu_pd(p, data); }
173
+ void Store (double * p, SIMD<mask64,4> mask) { _mm256_maskstore_pd(p, mask.Data(), data); }
174
+
175
+ template<typename T, typename std::enable_if<std::is_convertible<T, std::function<double(int)>>::value, int>::type = 0>
176
+ SIMD (const T & func)
177
+ {
178
+ data = _mm256_set_pd(func(3), func(2), func(1), func(0));
179
+ }
180
+
181
+ NETGEN_INLINE double operator[] (int i) const { return ((double*)(&data))[i]; }
182
+ NETGEN_INLINE double & operator[] (int i) { return ((double*)(&data))[i]; }
183
+ // [[deprecated("don't write to individual elements of SIMD")]]
184
+ // NETGEN_INLINE double & operator[] (int i) { return ((double*)(&data))[i]; }
185
+ NETGEN_INLINE __m256d Data() const { return data; }
186
+ NETGEN_INLINE __m256d & Data() { return data; }
187
+
188
+ SIMD<double,2> Lo() const { return _mm256_extractf128_pd(data, 0); }
189
+ SIMD<double,2> Hi() const { return _mm256_extractf128_pd(data, 1); }
190
+
191
+ operator std::tuple<double&,double&,double&,double&> ()
192
+ { return std::tuple<double&,double&,double&,double&>((*this)[0], (*this)[1], (*this)[2], (*this)[3]); }
193
+
194
+ template <int I>
195
+ double Get() const
196
+ {
197
+ static_assert(I>=0 && I<4, "Index out of range");
198
+ return (*this)[I];
199
+ }
200
+ };
201
+
202
+ NETGEN_INLINE auto Unpack (SIMD<double,4> a, SIMD<double,4> b)
203
+ {
204
+ return std::make_tuple(SIMD<double,4>(_mm256_unpacklo_pd(a.Data(),b.Data())),
205
+ SIMD<double,4>(_mm256_unpackhi_pd(a.Data(),b.Data())));
206
+ }
207
+
208
+ NETGEN_INLINE SIMD<double,4> operator- (SIMD<double,4> a) { return _mm256_xor_pd(a.Data(), _mm256_set1_pd(-0.0)); }
209
+ NETGEN_INLINE SIMD<double,4> operator+ (SIMD<double,4> a, SIMD<double,4> b) { return _mm256_add_pd(a.Data(),b.Data()); }
210
+ NETGEN_INLINE SIMD<double,4> operator- (SIMD<double,4> a, SIMD<double,4> b) { return _mm256_sub_pd(a.Data(),b.Data()); }
211
+ NETGEN_INLINE SIMD<double,4> operator* (SIMD<double,4> a, SIMD<double,4> b) { return _mm256_mul_pd(a.Data(),b.Data()); }
212
+ NETGEN_INLINE SIMD<double,4> operator/ (SIMD<double,4> a, SIMD<double,4> b) { return _mm256_div_pd(a.Data(),b.Data()); }
213
+ NETGEN_INLINE SIMD<double,4> operator* (double a, SIMD<double,4> b) { return _mm256_set1_pd(a)*b.Data(); }
214
+ NETGEN_INLINE SIMD<double,4> operator* (SIMD<double,4> b, double a) { return _mm256_set1_pd(a)*b.Data(); }
215
+
216
+ NETGEN_INLINE SIMD<double,4> sqrt (SIMD<double,4> a) { return _mm256_sqrt_pd(a.Data()); }
217
+ NETGEN_INLINE SIMD<double,4> floor (SIMD<double,4> a) { return _mm256_floor_pd(a.Data()); }
218
+ NETGEN_INLINE SIMD<double,4> ceil (SIMD<double,4> a) { return _mm256_ceil_pd(a.Data()); }
219
+ NETGEN_INLINE SIMD<double,4> fabs (SIMD<double,4> a) { return _mm256_max_pd(a.Data(), (-a).Data()); }
220
+ NETGEN_INLINE SIMD<double,4> round(SIMD<double,4> a) { return _mm256_round_pd(a.Data(), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC); }
221
+ NETGEN_INLINE SIMD<int64_t,4> lround (SIMD<double,4> a)
222
+ {
223
+ return my_mm256_cvtepi32_epi64(_mm256_cvtpd_epi32(_mm256_round_pd(a.Data(), _MM_FROUND_TO_NEAREST_INT | _MM_FROUND_NO_EXC)));
224
+ }
225
+
226
+ #ifdef __FMA__
227
+ NETGEN_INLINE SIMD<double,4> FMA (SIMD<double,4> a, SIMD<double,4> b, SIMD<double,4> c)
228
+ {
229
+ return _mm256_fmadd_pd (a.Data(), b.Data(), c.Data());
230
+ }
231
+ NETGEN_INLINE SIMD<double,4> FMA (const double & a, SIMD<double,4> b, SIMD<double,4> c)
232
+ {
233
+ return _mm256_fmadd_pd (_mm256_set1_pd(a), b.Data(), c.Data());
234
+ }
235
+ NETGEN_INLINE SIMD<double,4> FNMA (SIMD<double,4> a, SIMD<double,4> b, SIMD<double,4> c)
236
+ {
237
+ return _mm256_fnmadd_pd (a.Data(), b.Data(), c.Data());
238
+ }
239
+ NETGEN_INLINE SIMD<double,4> FNMA (const double & a, SIMD<double,4> b, SIMD<double,4> c)
240
+ {
241
+ return _mm256_fnmadd_pd (_mm256_set1_pd(a), b.Data(), c.Data());
242
+ }
243
+ #endif
244
+
245
+ #if defined(__FMA__) && !defined(__AVX512F__)
246
+ // make sure to use the update-version of fma
247
+ // important in matrix kernels using 12 sum-registers, 3 a-values and updated b-value
248
+ // avx512 has enough registers, and gcc seems to use only the first 16 z-regs
249
+ NETGEN_INLINE void FMAasm (SIMD<double,4> a, SIMD<double,4> b, SIMD<double,4> & sum)
250
+ {
251
+ asm ("vfmadd231pd %[a], %[b], %[sum]"
252
+ : [sum] "+x" (sum.Data())
253
+ : [a] "x" (a.Data()), [b] "x" (b.Data())
254
+ );
255
+ }
256
+
257
+ NETGEN_INLINE void FNMAasm (SIMD<double,4> a, SIMD<double,4> b, SIMD<double,4> & sum)
258
+ {
259
+ asm ("vfnmadd231pd %[a], %[b], %[sum]"
260
+ : [sum] "+x" (sum.Data())
261
+ : [a] "x" (a.Data()), [b] "x" (b.Data())
262
+ );
263
+ }
264
+ #endif
265
+
266
+ #if defined(__FMA__)
267
+ NETGEN_INLINE SIMD<double,4> FMAddSub (SIMD<double,4> a, SIMD<double,4> b, SIMD<double,4> c)
268
+ {
269
+ return _mm256_fmaddsub_pd(a.Data(), b.Data(), c.Data());
270
+ }
271
+ #endif
272
+
273
+ NETGEN_INLINE SIMD<double,4> SwapPairs (SIMD<double,4> a)
274
+ {
275
+ return _mm256_shuffle_pd (a.Data(), a.Data(), 0b0101);
276
+ }
277
+
278
+
279
+ NETGEN_INLINE SIMD<mask64,4> operator<= (SIMD<double,4> a , SIMD<double,4> b)
280
+ { return _mm256_cmp_pd (a.Data(), b.Data(), _CMP_LE_OQ); }
281
+ NETGEN_INLINE SIMD<mask64,4> operator< (SIMD<double,4> a , SIMD<double,4> b)
282
+ { return _mm256_cmp_pd (a.Data(), b.Data(), _CMP_LT_OQ); }
283
+ NETGEN_INLINE SIMD<mask64,4> operator>= (SIMD<double,4> a , SIMD<double,4> b)
284
+ { return _mm256_cmp_pd (a.Data(), b.Data(), _CMP_GE_OQ); }
285
+ NETGEN_INLINE SIMD<mask64,4> operator> (SIMD<double,4> a , SIMD<double,4> b)
286
+ { return _mm256_cmp_pd (a.Data(), b.Data(), _CMP_GT_OQ); }
287
+ NETGEN_INLINE SIMD<mask64,4> operator== (SIMD<double,4> a , SIMD<double,4> b)
288
+ { return _mm256_cmp_pd (a.Data(), b.Data(), _CMP_EQ_OQ); }
289
+ NETGEN_INLINE SIMD<mask64,4> operator!= (SIMD<double,4> a , SIMD<double,4> b)
290
+ { return _mm256_cmp_pd (a.Data(), b.Data(), _CMP_NEQ_OQ); }
291
+
292
+ NETGEN_INLINE SIMD<mask64,4> operator<= (SIMD<int64_t,4> a , SIMD<int64_t,4> b)
293
+ { return _mm256_xor_si256(_mm256_cmpgt_epi64(a.Data(),b.Data()),_mm256_set1_epi32(-1)); }
294
+ NETGEN_INLINE SIMD<mask64,4> operator< (SIMD<int64_t,4> a , SIMD<int64_t,4> b)
295
+ { return my_mm256_cmpgt_epi64(b.Data(),a.Data()); }
296
+ NETGEN_INLINE SIMD<mask64,4> operator>= (SIMD<int64_t,4> a , SIMD<int64_t,4> b)
297
+ { return _mm256_xor_si256(_mm256_cmpgt_epi64(b.Data(),a.Data()),_mm256_set1_epi32(-1)); }
298
+ NETGEN_INLINE SIMD<mask64,4> operator> (SIMD<int64_t,4> a , SIMD<int64_t,4> b)
299
+ { return my_mm256_cmpgt_epi64(a.Data(),b.Data()); }
300
+ NETGEN_INLINE SIMD<mask64,4> operator== (SIMD<int64_t,4> a , SIMD<int64_t,4> b)
301
+ { return my_mm256_cmpeq_epi64(a.Data(),b.Data()); }
302
+ NETGEN_INLINE SIMD<mask64,4> operator!= (SIMD<int64_t,4> a , SIMD<int64_t,4> b)
303
+ { return _mm256_xor_si256(my_mm256_cmpeq_epi64(a.Data(),b.Data()),_mm256_set1_epi32(-1)); }
304
+
305
+ #ifdef __AVX2__
306
+ NETGEN_INLINE SIMD<mask64,4> operator&& (SIMD<mask64,4> a, SIMD<mask64,4> b)
307
+ { return _mm256_and_si256 (a.Data(), b.Data()); }
308
+ NETGEN_INLINE SIMD<mask64,4> operator|| (SIMD<mask64,4> a, SIMD<mask64,4> b)
309
+ { return _mm256_or_si256 (a.Data(), b.Data()); }
310
+ NETGEN_INLINE SIMD<mask64,4> operator! (SIMD<mask64,4> a)
311
+ { return _mm256_xor_si256 (a.Data(), _mm256_cmpeq_epi64(a.Data(),a.Data())); }
312
+ #else //AVX2 is a superset of AVX. Without it, it is necessary to reinterpret the types
313
+ NETGEN_INLINE SIMD<mask64,4> operator&& (SIMD<mask64,4> a, SIMD<mask64,4> b)
314
+ { return _mm256_castpd_si256(_mm256_and_pd (_mm256_castsi256_pd(a.Data()),_mm256_castsi256_pd( b.Data()))); }
315
+ NETGEN_INLINE SIMD<mask64,4> operator|| (SIMD<mask64,4> a, SIMD<mask64,4> b)
316
+ { return _mm256_castpd_si256(_mm256_or_pd (_mm256_castsi256_pd(a.Data()), _mm256_castsi256_pd(b.Data()))); }
317
+ NETGEN_INLINE SIMD<mask64,4> operator! (SIMD<mask64,4> a)
318
+ { return _mm256_castpd_si256(_mm256_xor_pd (_mm256_castsi256_pd(a.Data()),_mm256_castsi256_pd( _mm256_cmpeq_epi64(a.Data(),a.Data())))); }
319
+ #endif
320
+
321
+ template <>
322
+ NETGEN_INLINE SIMD<double,4> Reinterpret (SIMD<int64_t,4> a)
323
+ {
324
+ return _mm256_castsi256_pd (a.Data());
325
+ }
326
+
327
+
328
+
329
+ NETGEN_INLINE SIMD<double,4> If (SIMD<mask64,4> a, SIMD<double,4> b, SIMD<double,4> c)
330
+ { return _mm256_blendv_pd(c.Data(), b.Data(), _mm256_castsi256_pd(a.Data())); }
331
+
332
+ NETGEN_INLINE SIMD<double,4> IfPos (SIMD<double,4> a, SIMD<double,4> b, SIMD<double,4> c)
333
+ {
334
+ auto cp = _mm256_cmp_pd (a.Data(), _mm256_setzero_pd(), _CMP_GT_OS);
335
+ return _mm256_blendv_pd(c.Data(), b.Data(), cp);
336
+ }
337
+
338
+ NETGEN_INLINE SIMD<double,4> IfZero (SIMD<double,4> a, SIMD<double,4> b, SIMD<double,4> c)
339
+ {
340
+ auto cp = _mm256_cmp_pd (a.Data(), _mm256_setzero_pd(), _CMP_EQ_OS);
341
+ return _mm256_blendv_pd(c.Data(), b.Data(), cp);
342
+ }
343
+
344
+ NETGEN_INLINE double HSum (SIMD<double,4> sd)
345
+ {
346
+ // __m128d hv = _mm_add_pd (_mm256_extractf128_pd(sd.Data(),0), _mm256_extractf128_pd(sd.Data(),1));
347
+ __m128d hv = (sd.Lo()+sd.Hi()).Data();
348
+ return _mm_cvtsd_f64 (_mm_hadd_pd (hv, hv));
349
+ }
350
+
351
+ NETGEN_INLINE auto HSum (SIMD<double,4> sd1, SIMD<double,4> sd2)
352
+ {
353
+ __m256d hv = _mm256_hadd_pd(sd1.Data(), sd2.Data());
354
+ __m128d hv2 = _mm_add_pd (_mm256_extractf128_pd(hv,0), _mm256_extractf128_pd(hv,1));
355
+ return SIMD<double,2>(_mm_cvtsd_f64 (hv2), _mm_cvtsd_f64(_mm_shuffle_pd (hv2, hv2, 3)));
356
+ }
357
+
358
+ NETGEN_INLINE auto HSum (SIMD<double,4> v1, SIMD<double,4> v2, SIMD<double,4> v3, SIMD<double,4> v4)
359
+ {
360
+ __m256d hsum1 = _mm256_hadd_pd (v1.Data(), v2.Data());
361
+ __m256d hsum2 = _mm256_hadd_pd (v3.Data(), v4.Data());
362
+ SIMD<double,4> hsum = _mm256_add_pd (_mm256_permute2f128_pd (hsum1, hsum2, 1+2*16),
363
+ _mm256_blend_pd (hsum1, hsum2, 12));
364
+ return hsum;
365
+ // return make_tuple(hsum[0], hsum[1], hsum[2], hsum[3]);
366
+ }
367
+
368
+
369
+ /*
370
+ // untested ...
371
+ NETGEN_INLINE SIMD<double,4> rsqrt (SIMD<double,4> x)
372
+ {
373
+ // return 1.0 / sqrt(x);
374
+ // SIMD<double,4> y = _mm256_rsqrt14_pd(x.Data()); // only avx512
375
+ SIMD<double,4> y = _mm256_cvtps_pd ( _mm_rsqrt_ps ( _mm256_cvtpd_ps (x.Data())));
376
+ auto x_half = 0.5*x;
377
+ y = y * (1.5 - (x_half * y * y));
378
+ y = y * (1.5 - (x_half * y * y));
379
+ return y;
380
+ }
381
+ */
382
+
383
+
384
+
385
+ NETGEN_INLINE SIMD<int64_t,4> If (SIMD<mask64,4> a, SIMD<int64_t,4> b, SIMD<int64_t,4> c)
386
+ { return _mm256_castpd_si256(_mm256_blendv_pd(_mm256_castsi256_pd(c.Data()), _mm256_castsi256_pd(b.Data()),
387
+ _mm256_castsi256_pd(a.Data()))); }
388
+
389
+
390
+
391
+ }
392
+
393
+ #endif // NETGEN_CORE_SIMD_AVX_HPP
394
+
@@ -0,0 +1,285 @@
1
+ #ifndef NETGEN_CORE_SIMD_AVX512_HPP
2
+ #define NETGEN_CORE_SIMD_AVX512_HPP
3
+
4
+ /**************************************************************************/
5
+ /* File: simd_avx512.hpp */
6
+ /* Author: Joachim Schoeberl, Matthias Hochsteger */
7
+ /* Date: 25. Mar. 16 */
8
+ /**************************************************************************/
9
+
10
+ #include <immintrin.h>
11
+
12
+ namespace ngcore
13
+ {
14
+
15
+ template <>
16
+ class SIMD<mask64,8>
17
+ {
18
+ __mmask8 mask;
19
+ public:
20
+ SIMD (size_t i)
21
+ : mask(_mm512_cmpgt_epi64_mask(_mm512_set1_epi64(i),
22
+ _mm512_set_epi64(7, 6, 5, 4, 3, 2, 1, 0)))
23
+ { ; }
24
+ SIMD (int i)
25
+ : mask(_mm512_cmpgt_epi64_mask(_mm512_set1_epi64(i),
26
+ _mm512_set_epi64(7, 6, 5, 4, 3, 2, 1, 0)))
27
+ { ; }
28
+ SIMD (int64_t i)
29
+ : mask(_mm512_cmpgt_epi64_mask(_mm512_set1_epi64(i),
30
+ _mm512_set_epi64(7, 6, 5, 4, 3, 2, 1, 0)))
31
+ { ; }
32
+ SIMD (__mmask8 _mask) : mask(_mask) { ; }
33
+ __mmask8 Data() const { return mask; }
34
+ static constexpr int Size() { return 8; }
35
+ static NETGEN_INLINE SIMD<mask64, 8> GetMaskFromBits (unsigned int i)
36
+ {
37
+ return SIMD<mask64, 8>(__mmask8(i));
38
+ }
39
+ };
40
+
41
+ template<>
42
+ class alignas(64) SIMD<int64_t,8>
43
+ {
44
+ __m512i data;
45
+
46
+ public:
47
+ static constexpr int Size() { return 8; }
48
+ SIMD () {}
49
+ SIMD (const SIMD &) = default;
50
+ SIMD & operator= (const SIMD &) = default;
51
+
52
+ SIMD (int64_t val) { data = _mm512_set1_epi64(val); }
53
+ SIMD (int64_t v0, int64_t v1, int64_t v2, int64_t v3, int64_t v4, int64_t v5, int64_t v6, int64_t v7) { data = _mm512_set_epi64(v7,v6,v5,v4,v3,v2,v1,v0); }
54
+ SIMD (__m512i _data) { data = _data; }
55
+
56
+ template<typename T, typename std::enable_if<std::is_convertible<T, std::function<int64_t(int)>>::value, int>::type = 0>
57
+ SIMD (const T & func)
58
+ {
59
+ data = _mm512_set_epi64(func(7), func(6), func(5), func(4), func(3), func(2), func(1), func(0));
60
+ }
61
+
62
+ SIMD (SIMD<int64_t,4> v0, SIMD<int64_t,4> v1)
63
+ : data(_mm512_castsi256_si512(v0.Data()))
64
+ {
65
+ data = _mm512_inserti64x4(data, v1.Data(), 1);
66
+ }
67
+
68
+ SIMD<int64_t,4> Lo() const { return _mm512_castsi512_si256(data); }
69
+ SIMD<int64_t,4> Hi() const { return _mm512_extracti64x4_epi64(data, 1); }
70
+
71
+
72
+ NETGEN_INLINE auto operator[] (int i) const { return ((int64_t*)(&data))[i]; }
73
+ NETGEN_INLINE auto & operator[] (int i) { return ((int64_t*)(&data))[i]; }
74
+ NETGEN_INLINE __m512i Data() const { return data; }
75
+ NETGEN_INLINE __m512i & Data() { return data; }
76
+ static SIMD FirstInt() { return { 0, 1, 2, 3, 4, 5, 6, 7 }; }
77
+ };
78
+
79
+ NETGEN_INLINE SIMD<int64_t,8> operator-(SIMD<int64_t,8> a) { return _mm512_sub_epi64(_mm512_setzero_si512(), a.Data()); }
80
+
81
+ NETGEN_INLINE SIMD<int64_t,8> operator+ (SIMD<int64_t,8> a, SIMD<int64_t,8> b) { return _mm512_add_epi64(a.Data(),b.Data()); }
82
+ NETGEN_INLINE SIMD<int64_t,8> operator- (SIMD<int64_t,8> a, SIMD<int64_t,8> b) { return _mm512_sub_epi64(a.Data(),b.Data()); }
83
+
84
+ NETGEN_INLINE SIMD<int64_t,8> If (SIMD<mask64,8> a, SIMD<int64_t,8> b, SIMD<int64_t,8> c)
85
+ { return _mm512_mask_blend_epi64(a.Data(), c.Data(), b.Data()); }
86
+
87
+
88
+ template<>
89
+ class alignas(64) SIMD<double,8>
90
+ {
91
+ __m512d data;
92
+ public:
93
+ static constexpr int Size() { return 8; }
94
+ SIMD () {}
95
+ SIMD (const SIMD &) = default;
96
+ SIMD & operator= (const SIMD &) = default;
97
+
98
+ SIMD (double val) { data = _mm512_set1_pd(val); }
99
+ SIMD (int val) { data = _mm512_set1_pd(val); }
100
+ SIMD (size_t val) { data = _mm512_set1_pd(val); }
101
+ SIMD (double const * p) { data = _mm512_loadu_pd(p); }
102
+ SIMD (double const * p, SIMD<mask64,8> mask)
103
+ { data = _mm512_mask_loadu_pd(_mm512_setzero_pd(), mask.Data(), p); }
104
+ SIMD (__m512d _data) { data = _data; }
105
+ SIMD (SIMD<double,4> v0, SIMD<double,4> v1)
106
+ : data(_mm512_set_pd(v1[3], v1[2], v1[1], v1[0], v0[3], v0[2], v0[1], v0[0]))
107
+ {}
108
+ SIMD (SIMD<double,6> v0, SIMD<double,2> v1)
109
+ : data(_mm512_set_pd(v1[1], v1[0], v0[5], v0[4], v0[3], v0[2], v0[1], v0[0]))
110
+ {}
111
+
112
+ template<typename T, typename std::enable_if<std::is_convertible<T, std::function<double(int)>>::value, int>::type = 0>
113
+ SIMD (const T & func)
114
+ {
115
+ data = _mm512_set_pd(func(7), func(6), func(5), func(4), func(3), func(2), func(1), func(0));
116
+ }
117
+
118
+ void Store (double * p) { _mm512_storeu_pd(p, data); }
119
+ void Store (double * p, SIMD<mask64,8> mask) { _mm512_mask_storeu_pd(p, mask.Data(), data); }
120
+
121
+ template <typename Function>
122
+ void SIMD_function (const Function & func, std::true_type)
123
+ {
124
+ data = (__m512d){ func(7), func(6), func(5), func(4),
125
+ func(3), func(2), func(1), func(0) };
126
+ }
127
+
128
+ // not a function
129
+ void SIMD_function (double const * p, std::false_type)
130
+ {
131
+ data = _mm512_loadu_pd(p);
132
+ }
133
+
134
+ void SIMD_function (double val, std::false_type)
135
+ {
136
+ data = _mm512_set1_pd(val);
137
+ }
138
+
139
+ void SIMD_function (__m512d _data, std::false_type)
140
+ {
141
+ data = _data;
142
+ }
143
+
144
+ NETGEN_INLINE double operator[] (int i) const { return ((double*)(&data))[i]; }
145
+ NETGEN_INLINE double & operator[] (int i) { return ((double*)(&data))[i]; }
146
+ NETGEN_INLINE __m512d Data() const { return data; }
147
+ NETGEN_INLINE __m512d & Data() { return data; }
148
+
149
+ SIMD<double,4> Lo() const { return _mm512_extractf64x4_pd(data, 0); }
150
+ SIMD<double,4> Hi() const { return _mm512_extractf64x4_pd(data, 1); }
151
+
152
+ template <int I>
153
+ double Get() const
154
+ {
155
+ static_assert(I>=0 && I<8, "Index out of range");
156
+ return (*this)[I];
157
+ }
158
+ };
159
+
160
+ NETGEN_INLINE SIMD<double,8> operator- (SIMD<double,8> a) { return _mm512_xor_pd(a.Data(), _mm512_set1_pd(-0.0)); } //{ return -a.Data(); }
161
+ NETGEN_INLINE SIMD<double,8> operator+ (SIMD<double,8> a, SIMD<double,8> b) { return _mm512_add_pd(a.Data(),b.Data()); }
162
+ NETGEN_INLINE SIMD<double,8> operator- (SIMD<double,8> a, SIMD<double,8> b) { return _mm512_sub_pd(a.Data(),b.Data()); }
163
+ NETGEN_INLINE SIMD<double,8> operator* (SIMD<double,8> a, SIMD<double,8> b) { return _mm512_mul_pd(a.Data(),b.Data()); }
164
+ NETGEN_INLINE SIMD<double,8> operator/ (SIMD<double,8> a, SIMD<double,8> b) { return _mm512_div_pd(a.Data(),b.Data()); }
165
+ NETGEN_INLINE SIMD<double,8> operator* (double a, SIMD<double,8> b) { return _mm512_set1_pd(a)*b.Data(); }
166
+ NETGEN_INLINE SIMD<double,8> operator* (SIMD<double,8> b, double a) { return _mm512_set1_pd(a)*b.Data(); }
167
+
168
+ NETGEN_INLINE SIMD<double,8> sqrt (SIMD<double,8> a) { return _mm512_sqrt_pd(a.Data()); }
169
+ NETGEN_INLINE SIMD<double,8> floor (SIMD<double,8> a) { return _mm512_floor_pd(a.Data()); }
170
+ NETGEN_INLINE SIMD<double,8> ceil (SIMD<double,8> a) { return _mm512_ceil_pd(a.Data()); }
171
+ NETGEN_INLINE SIMD<double,8> fabs (SIMD<double,8> a) { return _mm512_max_pd(a.Data(), ( - a).Data()); }
172
+
173
+ NETGEN_INLINE SIMD<mask64,8> operator<= (SIMD<double,8> a , SIMD<double,8> b)
174
+ { return _mm512_cmp_pd_mask (a.Data(), b.Data(), _CMP_LE_OQ); }
175
+ NETGEN_INLINE SIMD<mask64,8> operator< (SIMD<double,8> a , SIMD<double,8> b)
176
+ { return _mm512_cmp_pd_mask (a.Data(), b.Data(), _CMP_LT_OQ); }
177
+ NETGEN_INLINE SIMD<mask64,8> operator>= (SIMD<double,8> a , SIMD<double,8> b)
178
+ { return _mm512_cmp_pd_mask (a.Data(), b.Data(), _CMP_GE_OQ); }
179
+ NETGEN_INLINE SIMD<mask64,8> operator> (SIMD<double,8> a , SIMD<double,8> b)
180
+ { return _mm512_cmp_pd_mask (a.Data(), b.Data(), _CMP_GT_OQ); }
181
+ NETGEN_INLINE SIMD<mask64,8> operator== (SIMD<double,8> a , SIMD<double,8> b)
182
+ { return _mm512_cmp_pd_mask (a.Data(), b.Data(), _CMP_EQ_OQ); }
183
+ NETGEN_INLINE SIMD<mask64,8> operator!= (SIMD<double,8> a , SIMD<double,8> b)
184
+ { return _mm512_cmp_pd_mask (a.Data(), b.Data(), _CMP_NEQ_OQ); }
185
+
186
+ NETGEN_INLINE SIMD<mask64,8> operator<= (SIMD<int64_t,8> a , SIMD<int64_t,8> b)
187
+ { return _mm512_cmp_epi64_mask (a.Data(), b.Data(), _MM_CMPINT_LE); }
188
+ NETGEN_INLINE SIMD<mask64,8> operator< (SIMD<int64_t,8> a , SIMD<int64_t,8> b)
189
+ { return _mm512_cmp_epi64_mask (a.Data(), b.Data(), _MM_CMPINT_LT); }
190
+ NETGEN_INLINE SIMD<mask64,8> operator>= (SIMD<int64_t,8> a , SIMD<int64_t,8> b)
191
+ { return _mm512_cmp_epi64_mask (a.Data(), b.Data(), _MM_CMPINT_NLT); }
192
+ NETGEN_INLINE SIMD<mask64,8> operator> (SIMD<int64_t,8> a , SIMD<int64_t,8> b)
193
+ { return _mm512_cmp_epi64_mask (a.Data(), b.Data(), _MM_CMPINT_NLE); }
194
+ NETGEN_INLINE SIMD<mask64,8> operator== (SIMD<int64_t,8> a , SIMD<int64_t,8> b)
195
+ { return _mm512_cmp_epi64_mask (a.Data(), b.Data(), _MM_CMPINT_EQ); }
196
+ NETGEN_INLINE SIMD<mask64,8> operator!= (SIMD<int64_t,8> a , SIMD<int64_t,8> b)
197
+ { return _mm512_cmp_epi64_mask (a.Data(), b.Data(), _MM_CMPINT_NE); }
198
+
199
+ NETGEN_INLINE SIMD<mask64,8> operator&& (SIMD<mask64,8> a, SIMD<mask64,8> b)
200
+ { return (__mmask8)(a.Data() & b.Data()); }
201
+ NETGEN_INLINE SIMD<mask64,8> operator|| (SIMD<mask64,8> a, SIMD<mask64,8> b)
202
+ { return (__mmask8)(a.Data() | b.Data()); }
203
+ NETGEN_INLINE SIMD<mask64,8> operator! (SIMD<mask64,8> a)
204
+ { return (__mmask8)(~a.Data()); }
205
+
206
+ NETGEN_INLINE SIMD<double,8> If (SIMD<mask64,8> a, SIMD<double,8> b, SIMD<double,8> c)
207
+ { return _mm512_mask_blend_pd(a.Data(), c.Data(), b.Data()); }
208
+
209
+ NETGEN_INLINE SIMD<double,8> IfPos (SIMD<double,8> a, SIMD<double> b, SIMD<double> c)
210
+ {
211
+ auto k = _mm512_cmp_pd_mask(a.Data(),_mm512_setzero_pd(), _CMP_GT_OS);
212
+ return _mm512_mask_blend_pd(k,c.Data(),b.Data());
213
+ }
214
+ NETGEN_INLINE SIMD<double,8> IfZero (SIMD<double,8> a, SIMD<double,8> b, SIMD<double,8> c)
215
+ {
216
+ auto k = _mm512_cmp_pd_mask(a.Data(),_mm512_setzero_pd(), _CMP_EQ_OS);
217
+ return _mm512_mask_blend_pd(k,c.Data(),b.Data());
218
+ }
219
+
220
+
221
+ NETGEN_INLINE auto Unpack (SIMD<double,8> a, SIMD<double,8> b)
222
+ {
223
+ return std::make_tuple(SIMD<double,8>(_mm512_unpacklo_pd(a.Data(),b.Data())),
224
+ SIMD<double,8>(_mm512_unpackhi_pd(a.Data(),b.Data())));
225
+ }
226
+
227
+
228
+ NETGEN_INLINE double HSum (SIMD<double,8> sd)
229
+ {
230
+ SIMD<double,4> low = _mm512_extractf64x4_pd(sd.Data(),0);
231
+ SIMD<double,4> high = _mm512_extractf64x4_pd(sd.Data(),1);
232
+ return HSum(low)+HSum(high);
233
+ }
234
+
235
+ NETGEN_INLINE auto HSum (SIMD<double,8> sd1, SIMD<double,8> sd2)
236
+ {
237
+ return SIMD<double,2>(HSum(sd1), HSum(sd2));
238
+ }
239
+
240
+ NETGEN_INLINE SIMD<double,4> HSum (SIMD<double,8> v1, SIMD<double,8> v2, SIMD<double,8> v3, SIMD<double,8> v4)
241
+ {
242
+ SIMD<double> lo,hi;
243
+ std::tie(lo,hi) = Unpack(v1, v2);
244
+ SIMD<double> sum01 = lo+hi;
245
+ std::tie(lo,hi) = Unpack(v3, v4);
246
+ SIMD<double> sum23 = lo+hi;
247
+ // sum01 b a b a b a b a
248
+ // sum23 d c d c d c d c
249
+ // __m512 perm = _mm512_permutex2var_pd (sum01.Data(), _mm512_set_epi64(1,2,3,4,5,6,7,8), sum23.Data());
250
+ SIMD<double,4> ab = _mm512_extractf64x4_pd(sum01.Data(),0) + _mm512_extractf64x4_pd(sum01.Data(),1);
251
+ SIMD<double,4> cd = _mm512_extractf64x4_pd(sum23.Data(),0) + _mm512_extractf64x4_pd(sum23.Data(),1);
252
+ return _mm256_add_pd (_mm256_permute2f128_pd (ab.Data(), cd.Data(), 1 + 2 * 16), _mm256_blend_pd(ab.Data(), cd.Data(), 12));
253
+ }
254
+
255
+ NETGEN_INLINE SIMD<double,8> FMA (SIMD<double,8> a, SIMD<double,8> b, SIMD<double,8> c)
256
+ {
257
+ return _mm512_fmadd_pd (a.Data(), b.Data(), c.Data());
258
+ }
259
+ NETGEN_INLINE SIMD<double,8> FMA (const double & a, SIMD<double,8> b, SIMD<double,8> c)
260
+ {
261
+ return _mm512_fmadd_pd (_mm512_set1_pd(a), b.Data(), c.Data());
262
+ }
263
+
264
+ NETGEN_INLINE SIMD<double,8> FNMA (SIMD<double,8> a, SIMD<double,8> b, SIMD<double,8> c)
265
+ {
266
+ return _mm512_fnmadd_pd (a.Data(), b.Data(), c.Data());
267
+ }
268
+ NETGEN_INLINE SIMD<double,8> FNMA (const double & a, SIMD<double,8> b, SIMD<double,8> c)
269
+ {
270
+ return _mm512_fnmadd_pd (_mm512_set1_pd(a), b.Data(), c.Data());
271
+ }
272
+
273
+ NETGEN_INLINE SIMD<double,8> FMAddSub (SIMD<double,8> a, SIMD<double,8> b, SIMD<double,8> c)
274
+ {
275
+ return _mm512_fmaddsub_pd(a.Data(), b.Data(), c.Data());
276
+ }
277
+
278
+ NETGEN_INLINE SIMD<double,8> SwapPairs (SIMD<double,8> a)
279
+ {
280
+ return _mm512_shuffle_pd (a.Data(), a.Data(), 0b01010101);
281
+ }
282
+
283
+ }
284
+
285
+ #endif // NETGEN_CORE_SIMD_AVX512_HPP