-
-
Save excray/11e94d3fba7e7f9ea2a4 to your computer and use it in GitHub Desktop.
Code runs faster using placement new
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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