4da 24.05.2012 14:15 darkstar

вот код из #1899432

Предлагайте ваши варианты по оптимизации.

//-----------------------------------------
void calcParticles()
{
#ifdef USE_OPENMP
#pragma omp parallel for
#endif
for (int i = 0; i < pVecSz; i++)
{
Particle &p = particleVec[i];
float sqrs = sqrt((X-p.x)*(X-p.x)+(Y-p.y)*(Y-p.y)+(Z-p.z)*(Z-p.z) );
// float f = G*((p.M*M)/sqrt(rs));
float f = G*((p.M*M)/1.0);
float a = f/p.M;
float cosx = (X-p.x)/sqrs;
float cosy = (Y-p.y)/sqrs;
float cosz = (Z-p.z)/sqrs;
float ax = a*cosx;
float ay = a*cosy;
float az = a*cosz;
p.vx += ax*1/invFPS;
p.vy += ay*1/invFPS;
p.vz += az*1/invFPS;
p.x += p.vx;
p.y += p.vy;
p.z += p.vz;
}

}
//------------------------------------------

Сам думаю:
1. Вынести за пределы цикла:
float f = G*((p.M*M)/1.0);
float a = f/p.M;
2. Заюзать pthreads (вдруг полущ будет)
3. Заюзать SSE3 для извлечения квадратного корня и подсчетса направляющих косинусов.

1. dorfe 24.05.2012 17:09

SSE если на PC.

2. 4dadorfe /1 24.05.2012 18:08

да, меня PC интересует. Кстати, думаю, если сделать на cuda, то можно раз в 5 повысить эффективность.

Do you really want to delete ?