0
OpenCLを使用して積分器を並列化するとき、ループ全体をカーネルに入れるのは悪い習慣ですか?OpenCL RK4とGPUの統合
私はC++で書いたRK4インテグレータをOpenCLに移動しようとしています。そのため、現在はOpenMPを使用しています。
私は、実行ごとに約700回のループ反復で、1000万回以上の独立した統合実行を実行する必要があります。私は現在ループをカーネルにストップコンディションで書き込んでいますが、期待通りのパフォーマンスは得られません。
現在のCLカーネルは、スニペット:
`
while (inPos.z > -1.0f){
cnt++;
//Eval 1
//Euler Velocity
vel1 = inVel + (inAcc * 0.0f);
//Euler Position
pos1 = inPos + (vel1 * 0.0f) + ((inAcc * 0.0f)*0.5f);
//Drag and accels
combVel = sqrt(pow(vel1.x, 2)+pow(vel1.y, 2)+pow(vel1.z, 2));
//motionUtils::drag(netForce, combVel, mortSigma, outPos.z);
dragForce = mortSigma*1.225f*pow(combVel, 2);
//Normalise vector
normVel = vel1/combVel;
//Drag Components
drag = (normVel * dragForce)*-1.0f;
//Add Gravity force
drag.z+=((mortMass*9.801f)*-1.0f);
//Acceleration components
acc1 = drag/mortMass;
...
//Taylor Expansion
tayVel = (vel1+((vel2+vel3)*2.0f)+vel4) * (1.0f/6.0f);
inAcc = (acc1+((acc2+acc3)*2.0f)+acc4) * (1.0f/6.0f);
tayPos = (pos1+((pos2+pos3)*2.0f)+pos4) * (1.0f/6.0f);
//Swap ready for next iteration
inPos = inPos + (tayVel * timeStep);
inVel = inVel + (inAcc * timeStep);
` 任意の考え/提案を、はるかに高く評価します。
これは負荷を助けました - ありがとうhuseyin – Dusted
あなたの歓迎、またコンパイラ文字列から高速リラックスした数学オプションを有効にすることができます。 –