Skip to content

Instantly share code, notes, and snippets.

@excray
Created July 24, 2012 19:27
Show Gist options
  • Save excray/11e94d3fba7e7f9ea2a4 to your computer and use it in GitHub Desktop.
Save excray/11e94d3fba7e7f9ea2a4 to your computer and use it in GitHub Desktop.
Code runs faster using placement new
#include <iostream>
#include <sys/time.h>
typedef float v4sf __attribute__ ((vector_size(16)));
using namespace std;
class Config
{
public:
///////////////////// Class vars declaration /////////////////////////
static float c_a[ 3 ];
static float c_b[ 3 ];
static float c_c[ 3 ];
static float c_d[ 3 ];
static float c_e[ 3 ];
static float c_f[ 3 ];
static float c_g[ 3 ];
static float c_h[ 3 ];
static float c_i[ 3 ];
static float c_j[ 3 ];
};
Config configObj;
//Config configObj;
#define __CLASSNAME__ Config
//////////// Class vars initialization ////////
float __CLASSNAME__::c_a[ 3 ] = { 0, 0.02, 0.1 };
float __CLASSNAME__::c_b[ 3 ] = { 0, 0.2, 0.2 };
float __CLASSNAME__::c_c[ 3 ] = { 0, -65.0, -65.0 };
float __CLASSNAME__::c_d[ 3 ] = { 0, 8.0, 2.0 };
float __CLASSNAME__::c_e[ 3 ] = { 0, 1.0, 1.0 };
float __CLASSNAME__::c_f[ 3 ] = { 0, 0.9, 0.9 };
float __CLASSNAME__::c_g[ 3 ] = { 0, 0, 0 };
float __CLASSNAME__::c_h[ 3 ] = { 0, 1.0, 1.0 };
float __CLASSNAME__::c_i[ 3 ] = { 0, 0.8582, 0.8582 };
float __CLASSNAME__::c_j[ 3 ] = { 0, 0, 0 };
class Unit
{
public:
~Unit();
Unit(int num_of_instances);
void Update( int num );
public:
///////////////////// Instance vars declaration ///////////////////////
float * ip;
float * in;
float * v;
float * u;
float * gG;
float * gN;
float * PN;
float * _gs;
float * _ns;
float * _vslow;
float * _v0;
float * _vOld;
};
Unit::Unit(int num_of_instances)
{
//////////// InstanceScalarVars initialization /////////////
ip = new float [num_of_instances];
in = new float [num_of_instances];
v = new float [num_of_instances];
u = new float [num_of_instances];
gG = new float [num_of_instances];
gN = new float [num_of_instances];
PN = new float[num_of_instances];
_gs = new float [num_of_instances];
_ns = new float [num_of_instances];
_vslow = new float [num_of_instances];
_v0 = new float [num_of_instances];
_vOld = new float [num_of_instances];
//cout<<"Absolute address:"<<ip<<" "<<in<<" "<<v<<" "<<u<<" "<<gG<<" "<<gN<<endl;
}
Unit::~Unit()
{
delete[] ip;
delete[] in;
delete[] v;
delete[] u;
delete[] gG;
delete[] gN;
delete[] PN;
delete[] _gs;
delete[] _ns;
delete[] _vslow;
delete[] _v0;
delete[] _vOld;
}
double getCurrentTime(){
struct timeval curr;
struct timezone tz;
gettimeofday(&curr, &tz);
double tmp = static_cast<double>(curr.tv_sec) * static_cast<double>(1000000)
+ static_cast<double>(curr.tv_usec);
return tmp*1e-6;
}
void Unit::Update(int num)
{
v4sf var_0 = {configObj.c_e[1],configObj.c_e[1],configObj.c_e[1],configObj.c_e[1]};
v4sf var_1 = {configObj.c_g[1],configObj.c_g[1],configObj.c_g[1],configObj.c_g[1]};
v4sf var_2 = {80,80,80,80};
v4sf var_3 = {configObj.c_j[1],configObj.c_j[1],configObj.c_j[1],configObj.c_j[1]};
v4sf var_4 = {0.5,0.5,0.5,0.5};
v4sf var_5 = {0.04,0.04,0.04,0.04};
v4sf var_6 = {5,5,5,5};
v4sf var_7 = {140,140,140,140};
v4sf var_8 = {configObj.c_i[1],configObj.c_i[1],configObj.c_i[1],configObj.c_i[1]};
v4sf var_9 = {configObj.c_a[1],configObj.c_a[1],configObj.c_a[1],configObj.c_a[1]};
v4sf var_10 = {configObj.c_b[1],configObj.c_b[1],configObj.c_b[1],configObj.c_b[1]};
v4sf var_11 = {configObj.c_f[1],configObj.c_f[1],configObj.c_f[1],configObj.c_f[1]};
v4sf var_12 = {configObj.c_h[1],configObj.c_h[1],configObj.c_h[1],configObj.c_h[1]};
v4sf var_13 = {0,0,0,0};
v4sf var_14 = {0,0,0,0};
for( int uidx = 0; uidx < num; uidx+=4 )
{
*(v4sf*)&_vOld[uidx] = *(v4sf*)&v[uidx];
*(v4sf*)&gG[uidx] = *(v4sf*)&gG[uidx] + (var_0 * *(v4sf*)&in[uidx]);
*(v4sf*)&gN[uidx] = *(v4sf*)&gN[uidx] + (var_1 * *(v4sf*)&ip[uidx]);
*(v4sf*)&_gs[uidx] = *(v4sf*)&gG[uidx] * (*(v4sf*)&v[uidx] + var_2);
*(v4sf*)&_ns[uidx] = *(v4sf*)&gN[uidx] * *(v4sf*)&v[uidx];
*(v4sf*)&_vslow[uidx] = *(v4sf*)&v[uidx] - (*(v4sf*)&_ns[uidx] + *(v4sf*)&_gs[uidx]);
*(v4sf*)&_v0[uidx] = *(v4sf*)&_vslow[uidx] + (var_3 * *(v4sf*)&PN[uidx]);
*(v4sf*)&v[uidx] = *(v4sf*)&v[uidx] + var_4 * (((var_5 * *(v4sf*)&v[uidx] + var_6) * *(v4sf*)&v[uidx] + var_7) - (*(v4sf*)&u[uidx] - (var_8 * *(v4sf*)&ip[uidx])));
*(v4sf*)&u[uidx] = *(v4sf*)&u[uidx] + (var_9 * ((var_10 * *(v4sf*)&_vOld[uidx]) - *(v4sf*)&u[uidx]));
*(v4sf*)&gG[uidx] = *(v4sf*)&gG[uidx] * var_11;
*(v4sf*)&gN[uidx] = *(v4sf*)&gN[uidx] * var_12;
*(v4sf*)&ip[uidx] = var_13;
*(v4sf*)&in[uidx] = var_14;
}
}
int main()
{
int num = 500000;
Unit* units = new Unit(num);
int d = 10000;
double start = getCurrentTime();
for(int i = 0; i < d; i ++)
{
units->Update(num);
}
double end = getCurrentTime();
cout<<"Time is "<<end-start<<endl;
return 0;
}
#include <iostream>
#include <sys/time.h>
typedef float v4sf __attribute__ ((vector_size(16)));
using namespace std;
class Config
{
public:
///////////////////// Class vars declaration /////////////////////////
static float c_a[ 3 ];
static float c_b[ 3 ];
static float c_c[ 3 ];
static float c_d[ 3 ];
static float c_e[ 3 ];
static float c_f[ 3 ];
static float c_g[ 3 ];
static float c_h[ 3 ];
static float c_i[ 3 ];
static float c_j[ 3 ];
};
Config configObj;
//Config configObj;
#define __CLASSNAME__ Config
//////////// Class vars initialization ////////
float __CLASSNAME__::c_a[ 3 ] = { 0, 0.02, 0.1 };
float __CLASSNAME__::c_b[ 3 ] = { 0, 0.2, 0.2 };
float __CLASSNAME__::c_c[ 3 ] = { 0, -65.0, -65.0 };
float __CLASSNAME__::c_d[ 3 ] = { 0, 8.0, 2.0 };
float __CLASSNAME__::c_e[ 3 ] = { 0, 1.0, 1.0 };
float __CLASSNAME__::c_f[ 3 ] = { 0, 0.9, 0.9 };
float __CLASSNAME__::c_g[ 3 ] = { 0, 0, 0 };
float __CLASSNAME__::c_h[ 3 ] = { 0, 1.0, 1.0 };
float __CLASSNAME__::c_i[ 3 ] = { 0, 0.8582, 0.8582 };
float __CLASSNAME__::c_j[ 3 ] = { 0, 0, 0 };
class Unit
{
public:
~Unit();
Unit(int num_of_instances);
void Update( int num );
public:
///////////////////// Instance vars declaration ///////////////////////
float * ip;
float * in;
float * v;
float * u;
float * gG;
float * gN;
float * PN;
float * _gs;
float * _ns;
float * _vslow;
float * _v0;
float * _vOld;
char* buffer;
};
Unit::Unit(int num_of_instances)
{
//////////// InstanceScalarVars initialization /////////////
buffer = new char[12*sizeof(float)*num_of_instances];
char* tmp = buffer;
ip = new(buffer) float [num_of_instances];
in = new(buffer+sizeof(float)*num_of_instances) float [num_of_instances];
v = new(buffer+2*sizeof(float)*num_of_instances) float [num_of_instances];
u = new(buffer+3*sizeof(float)*num_of_instances) float [num_of_instances];
gG = new(buffer+4*sizeof(float)*num_of_instances) float [num_of_instances];
gN = new(buffer+5*sizeof(float)*num_of_instances) float [num_of_instances];
PN = new (buffer+6*sizeof(float)*num_of_instances) float[num_of_instances];
_gs = new(buffer+7*sizeof(float)*num_of_instances) float [num_of_instances];
_ns = new(buffer+8*sizeof(float)*num_of_instances) float [num_of_instances];
_vslow = new(buffer+9*sizeof(float)*num_of_instances) float [num_of_instances];
_v0 = new(buffer+10*sizeof(float)*num_of_instances) float [num_of_instances];
_vOld = new(buffer+11*sizeof(float)*num_of_instances) float [num_of_instances];
buffer=tmp;
//cout<<"Absolute address:"<<ip<<" "<<in<<" "<<v<<" "<<u<<" "<<gG<<" "<<gN<<endl;
}
Unit::~Unit()
{
delete[] buffer;
}
double getCurrentTime(){
struct timeval curr;
struct timezone tz;
gettimeofday(&curr, &tz);
double tmp = static_cast<double>(curr.tv_sec) * static_cast<double>(1000000)
+ static_cast<double>(curr.tv_usec);
return tmp*1e-6;
}
void Unit::Update(int num)
{
v4sf var_0 = {configObj.c_e[1],configObj.c_e[1],configObj.c_e[1],configObj.c_e[1]};
v4sf var_1 = {configObj.c_g[1],configObj.c_g[1],configObj.c_g[1],configObj.c_g[1]};
v4sf var_2 = {80,80,80,80};
v4sf var_3 = {configObj.c_j[1],configObj.c_j[1],configObj.c_j[1],configObj.c_j[1]};
v4sf var_4 = {0.5,0.5,0.5,0.5};
v4sf var_5 = {0.04,0.04,0.04,0.04};
v4sf var_6 = {5,5,5,5};
v4sf var_7 = {140,140,140,140};
v4sf var_8 = {configObj.c_i[1],configObj.c_i[1],configObj.c_i[1],configObj.c_i[1]};
v4sf var_9 = {configObj.c_a[1],configObj.c_a[1],configObj.c_a[1],configObj.c_a[1]};
v4sf var_10 = {configObj.c_b[1],configObj.c_b[1],configObj.c_b[1],configObj.c_b[1]};
v4sf var_11 = {configObj.c_f[1],configObj.c_f[1],configObj.c_f[1],configObj.c_f[1]};
v4sf var_12 = {configObj.c_h[1],configObj.c_h[1],configObj.c_h[1],configObj.c_h[1]};
v4sf var_13 = {0,0,0,0};
v4sf var_14 = {0,0,0,0};
for( int uidx = 0; uidx < num; uidx+=4 )
{
*(v4sf*)&_vOld[uidx] = *(v4sf*)&v[uidx];
*(v4sf*)&gG[uidx] = *(v4sf*)&gG[uidx] + (var_0 * *(v4sf*)&in[uidx]);
*(v4sf*)&gN[uidx] = *(v4sf*)&gN[uidx] + (var_1 * *(v4sf*)&ip[uidx]);
*(v4sf*)&_gs[uidx] = *(v4sf*)&gG[uidx] * (*(v4sf*)&v[uidx] + var_2);
*(v4sf*)&_ns[uidx] = *(v4sf*)&gN[uidx] * *(v4sf*)&v[uidx];
*(v4sf*)&_vslow[uidx] = *(v4sf*)&v[uidx] - (*(v4sf*)&_ns[uidx] + *(v4sf*)&_gs[uidx]);
*(v4sf*)&_v0[uidx] = *(v4sf*)&_vslow[uidx] + (var_3 * *(v4sf*)&PN[uidx]);
*(v4sf*)&v[uidx] = *(v4sf*)&v[uidx] + var_4 * (((var_5 * *(v4sf*)&v[uidx] + var_6) * *(v4sf*)&v[uidx] + var_7) - (*(v4sf*)&u[uidx] - (var_8 * *(v4sf*)&ip[uidx])));
*(v4sf*)&u[uidx] = *(v4sf*)&u[uidx] + (var_9 * ((var_10 * *(v4sf*)&_vOld[uidx]) - *(v4sf*)&u[uidx]));
*(v4sf*)&gG[uidx] = *(v4sf*)&gG[uidx] * var_11;
*(v4sf*)&gN[uidx] = *(v4sf*)&gN[uidx] * var_12;
*(v4sf*)&ip[uidx] = var_13;
*(v4sf*)&in[uidx] = var_14;
}
}
int main()
{
int num = 500000;
Unit* units = new Unit(num);
int d = 10000;
double start = getCurrentTime();
for(int i = 0; i < d; i ++)
{
units->Update(num);
}
double end = getCurrentTime();
cout<<"Time is "<<end-start<<endl;
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment