#include #include #include #include #include #if defined(__clang__) #pragma clang diagnostic ignored "-Wgnu-alignof-expression" #endif #ifdef _MSC_VER #define INLINE __force_inline __flatten __declspec(nothrow) __declspec(noalias) inline #else #define INLINE __attribute__((always_inline)) __attribute__((flatten)) __attribute__((nothrow)) __attribute__((const)) inline #endif template(N)> struct alignas((N == N_POW2 ? N_POW2 : 1) * alignof(T)) vec : std::array { }; /* n-dimensional dot/scalar product */ template INLINE T dot(const vec& a, const vec& b, T dst = (T)0) { #pragma omp simd reduction(+:dst) for(size_t i = 0; i < N; i++) dst += a[i] * b[i]; return dst; } int main() { vec a = { 1, 3, -5 }; vec b = { 4, -2, -1 }; vec c = { 1, 2, 3, 4 }; vec,3> d = { a, b, a }; vec,4> e = { c, c, c, c }; printf("dot.product of {1,3,-5} and {4,-2,-1}: %d", dot(a,b)); puts(""); printf("type align/size"); puts(""); printf("vec %4zu/%-4zu",alignof(a), sizeof(a)); puts(""); printf("vec %4zu/%-4zu",alignof(c), sizeof(c)); puts(""); printf("vec,3> %4zu/%-4zu",alignof(d), sizeof(d)); puts(""); printf("vec,4> %4zu/%-4zu",alignof(e), sizeof(e)); puts(""); exit(EXIT_SUCCESS); }