Changes in directory llvm/examples/SIMD/Saxpy:
Makefile added (r1.1.2.1) main.c added (r1.1.2.1) saxpy.altivec.handwritten.c added (r1.1.2.1) saxpy.h added (r1.1.2.1) saxpy.sse.handwritten.c added (r1.1.2.1) saxpy.vectorc.c added (r1.1.2.1) --- Log message: Examples to illustrate Vector LLVM's SIMD support. --- Diffs of the changes: (+132 -0) Makefile | 4 ++ main.c | 81 ++++++++++++++++++++++++++++++++++++++++++++ saxpy.altivec.handwritten.c | 12 ++++++ saxpy.h | 5 ++ saxpy.sse.handwritten.c | 16 ++++++++ saxpy.vectorc.c | 14 +++++++ 6 files changed, 132 insertions Index: llvm/examples/SIMD/Saxpy/Makefile diff -c /dev/null llvm/examples/SIMD/Saxpy/Makefile:1.1.2.1 *** /dev/null Sun Oct 23 17:50:00 2005 --- llvm/examples/SIMD/Saxpy/Makefile Sun Oct 23 17:49:41 2005 *************** *** 0 **** --- 1,4 ---- + NAME= saxpy + + include ../Makefile.common + Index: llvm/examples/SIMD/Saxpy/main.c diff -c /dev/null llvm/examples/SIMD/Saxpy/main.c:1.1.2.1 *** /dev/null Sun Oct 23 17:50:24 2005 --- llvm/examples/SIMD/Saxpy/main.c Sun Oct 23 17:49:41 2005 *************** *** 0 **** --- 1,81 ---- + #include <stdio.h> + #include <stdlib.h> + #include <sys/time.h> + #include <sys/times.h> + #include <sys/resource.h> + #include "../_malloc.h" + #include <unistd.h> + + #include "saxpy.h" + + short *in1, *in2, *vector, *scalar; + + void init() { + unsigned i; + in1 = _malloc(N*sizeof(short)); + for (i = 0; i < N; ++i) + in1[i] = N/2 - i; + in2 = _malloc(N*sizeof(short)); + for (i = 0; i < N; ++i) + in2[i] = i - N/2; + vector = _malloc(N*sizeof(short)); + scalar = _malloc(N*sizeof(short)); + } + + void run(long *scalar_time, long *vector_time) { + unsigned i; + struct tms buf_s, buf_e; + + times(&buf_s); + for (i = 0; i < 1000000; ++i) + saxpy_scalar(scalar, in1, in2, A, N); + times(&buf_e); + *scalar_time = buf_e.tms_utime - buf_s.tms_utime; + printf("scalar time=%d, ", *scalar_time); + + times(&buf_s); + for (i = 0; i < 1000000; ++i) + saxpy_vector (vector, in1, in2, A, N); + times(&buf_e); + *vector_time = buf_e.tms_utime - buf_s.tms_utime; + printf("vector time=%d, ", *vector_time); + + for (i = 0; i < N; i++) { + if (vector[i] != scalar[i]) { + printf ("FAILED\n"); + exit(1); + } + } + + float speedup = ((float) *scalar_time) / *vector_time; + printf("speedup=%f\n", speedup); + + } + + int + main (void) { + unsigned i; + init(); + + long best_scalar = -1, best_vector = -1; + long scalar, vector; + for (i = 0; i < NRUNS; ++i) { + run (&scalar, &vector); + if (best_scalar < 0 || best_scalar > scalar) + best_scalar = scalar; + if (best_vector < 0 || best_vector > vector) + best_vector = vector; + } + + printf("best scalar=%d, ", best_scalar); + printf("best vector=%d, ", best_vector); + printf("speedup=%f\n", ((float) best_scalar)/best_vector); + printf ("PASSED\n"); + return 0; + } + + void saxpy_scalar (short *z, const short *x, const short *y, short a, unsigned n) { + int i; + for (i = 0; i < n; ++i) + *z++ = a * *x++ + *y++; + } Index: llvm/examples/SIMD/Saxpy/saxpy.altivec.handwritten.c diff -c /dev/null llvm/examples/SIMD/Saxpy/saxpy.altivec.handwritten.c:1.1.2.1 *** /dev/null Sun Oct 23 17:50:24 2005 --- llvm/examples/SIMD/Saxpy/saxpy.altivec.handwritten.c Sun Oct 23 17:49:41 2005 *************** *** 0 **** --- 1,12 ---- + void saxpy_vector (vector short *z, const vector short *x, const vector short *y, + short a, unsigned n) { + unsigned i; + vector short a_vec; + *((short*) &a_vec) = a; + a_vec = vec_splat(a_vec, 0); + + for (i = 0; i < n/8; ++i) + *z++ = vec_mladd(a_vec, *x++, *y++); + + } + Index: llvm/examples/SIMD/Saxpy/saxpy.h diff -c /dev/null llvm/examples/SIMD/Saxpy/saxpy.h:1.1.2.1 *** /dev/null Sun Oct 23 17:50:24 2005 --- llvm/examples/SIMD/Saxpy/saxpy.h Sun Oct 23 17:49:41 2005 *************** *** 0 **** --- 1,5 ---- + #define N 1024 + #define A 10 + + void saxpy_vector(short *z, const short *x, const short *y, short a, unsigned n); + void saxpy_scalar(short *z, const short *x, const short *y, short a, unsigned n); Index: llvm/examples/SIMD/Saxpy/saxpy.sse.handwritten.c diff -c /dev/null llvm/examples/SIMD/Saxpy/saxpy.sse.handwritten.c:1.1.2.1 *** /dev/null Sun Oct 23 17:50:24 2005 --- llvm/examples/SIMD/Saxpy/saxpy.sse.handwritten.c Sun Oct 23 17:49:42 2005 *************** *** 0 **** --- 1,16 ---- + #include "SSE.h" + + void saxpy_vector(short *z, short *x, short *y, short a, unsigned n) { + __m128i* x_ptr = (__m128i*) x; + __m128i* y_ptr = (__m128i*) y; + __m128i* z_ptr = (__m128i*) z; + __m128i a_vec = _mm_splat_epi16(a); + int i; + for (i = 0; i < n/8; ++i) { + __m128i x_vec = x_ptr[i]; + __m128i y_vec = y_ptr[i]; + __m128i z_vec = _mm_add_epi16( _mm_mullo_epi16(x_vec,a_vec),y_vec); + z_ptr[i] = z_vec; + } + } + Index: llvm/examples/SIMD/Saxpy/saxpy.vectorc.c diff -c /dev/null llvm/examples/SIMD/Saxpy/saxpy.vectorc.c:1.1.2.1 *** /dev/null Sun Oct 23 17:50:25 2005 --- llvm/examples/SIMD/Saxpy/saxpy.vectorc.c Sun Oct 23 17:49:42 2005 *************** *** 0 **** --- 1,14 ---- + #include "VectorC.h" + + void saxpy_vector(short *z, short *x, short *y, + short a, unsigned n) { + short a_vec = vllvm_fixed_vimm_short(a,8); + int i; + for (i = 0; i < n/8; ++i) { + short x_vec = vllvm_load_short(x, 8, i); + short y_vec = vllvm_load_short(y, 8, i); + short z_vec = a_vec * x_vec + y_vec; + vllvm_store_short(z_vec, z, i); + } + } + _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits