We're installing EasyBuild 2.9.0 on our new cluster, and user
application codes should be built on top of the latest foss-2016 toolchain.
Since our cluster has 4 different generations of Intel Xeon hardware
(Nehalem, Sandy/Ivy Bridge, Haswell, Broadwell), users want to compile
their application codes optimized for the compute node hardware (gcc
-march=native).
Question: Is there a best practices method for providing EasyBuild
modules which are compiled for different hardware architectures?
I can see some possible solutions:
1. Build totally separate and complete EB module trees for each of the
architectures. Mount the correct EB module tree by NFS on the same
mount point (/home/modules, say) on compute nodes based upon its
architecture.
2. Within a single EB hierarchy, build multiple versions of just the
application code modules requiring optimized code. This has the
advantage of a shared module tree for all non-application-code modules.
Users must then identify the compute node's architecture at run-time and
load the correct module for that architecture (this sounds complicated
for users).
Bonus question: What's the most portable, reliable and lightweight way
to determine which Intel Xeon architecture you're working on? Googling
the question suggests using /proc/cpuinfo:
# grep "model name" /proc/cpuinfo | head -1
model name : Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz
but then you must parse this string to discover whether you're on Xeon,
Xeon v2, v3, v4, or v5 (from next year).
Thanks for sharing your insights,
Ole