Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- #include <cstring>
- #include <ctime>
- #include <x86intrin.h>
- typedef union
- {
- __m128 a;
- float b[4];
- } float4;
- int rand_int(int limit)
- {
- return rand() % limit;
- }
- int main(int argc, char *argv[])
- {
- if(argc < 2)
- {
- std::cout << "Missing parameter" << std::endl;
- return 1;
- }
- if(std::atoi(argv[1]) == 0)
- {
- std::cout << "Invalid parameter" << std::endl;
- return 1;
- }
- int vector_size = std::atoi(argv[1]);
- // Pad vector to bit width divisible by 128
- vector_size += (vector_size % 4 == 0) ? vector_size : 4 - (vector_size % 4);
- float* a = new float[vector_size];
- float* b = new float[vector_size];
- float* r_std = new float[vector_size];
- float* r_sse = new float[vector_size];
- srand(time(NULL));
- // Fill vectors with random ints
- for(int i = 0; i < vector_size; i++)
- {
- a[i] = rand_int(5);
- b[i] = rand_int(5);
- }
- // Print input arrays
- std::cout << "a : ";
- for(int i = 0; i < vector_size; i++)
- {
- std::cout << a[i] << ", ";
- }
- std::cout << std::endl;
- std::cout << "b : ";
- for(int i = 0; i < vector_size; i++)
- {
- std::cout << b[i] << ", ";
- }
- std::cout << std::endl;
- // Add both vectors normal way
- for(int i = 0; i < vector_size; i++)
- {
- r_std[i] = a[i] + b[i];
- }
- // Add vectors with sse instructions
- float4 c;
- float4 d;
- float4 r;
- for(int i = 0; i < vector_size; i+=4)
- {
- for(int j = 0; j < 4; j++)
- {
- c.b[j] = a[i+j];
- d.b[j] = b[i+j];
- }
- //SSE magic
- r.a = _mm_add_ps(c.a, d.a);
- for(int j = 0; j < 4; j++)
- {
- r_sse[i+j] = r.b[j];
- }
- }
- std::cout << std::endl;
- std::cout << std::endl;
- // Print output arrays
- std::cout << "r_std: ";
- for(int i = 0; i < vector_size; i++)
- {
- std::cout << r_std[i] << ", ";
- }
- std::cout << std::endl;
- std::cout << "r_sse: ";
- for(int i = 0; i < vector_size; i++)
- {
- std::cout << r_sse[i] << ", ";
- }
- std::cout << std::endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement