2016-08-04 9 views
2

GLSLシェーダの新機能であるため、古いネットブックでは、完全に動作するシェーダに1行追加すると、突然実行時間が数千倍になる可能性があります。GLSLシェーダでこれらのパフォーマンスブレークポイントが発生する原因は何ですか?

例えば、このフラグメントシェーダは、値が33であるS「limitの値32以下で、かつ一度実行するように10秒かかる」limitをしながら、瞬時に実行されます。

int main() 
{ 
    float limit=33.;//runs instantly if =32. 
    float useless=0.5; 
    for(float i=0.;i<limit;i++) useless=useless*useless; 
    gl_FragColor=useless*vec4(1.,1.,1.,1.); 
} 

にも私を混乱させる何追加するということです1つまたは複数のuseless自己掛け算32ターンループのが鋭い時間を増加させることはありません。

ここにはforループのない例があります。それは6 sin計算して自分のコンピュータ上のミリ秒以内に実行され、追加第七1が突然プログラムを実行するのに約500msのを取る作る:

int main() 
{ 
    float useless=gl_FragCoord.x; 
    useless=sin(useless); 
    useless=sin(useless); 
    useless=sin(useless); 
    useless=sin(useless); 
    useless=sin(useless); 
    useless=sin(useless); 
    useless=sin(useless);//the straw that breaks the shader's back 
    gl_FragColor=useless*vec4(1.,1.,1.,1.); 
} 

を私が所有して少ない旧式のコンピュータ上で、コンパイル時間が前にあまりにも大きくなり私はそのような破壊点を見つけることができます。

私のネットブックでは、操作を追加するにつれて実行時間が連続的に増加すると思います。

これらの突然の飛躍を引き起こす原因を知りたいのですが、それが問題であれば、合理的に最も広いスチームオーディエンスをターゲットにして、それを解決する必要があります。役に立つと思うなら、ここにネットブックがあります。私はhttp://support.hp.com/ch-fr/document/c01949780とそのチップセットに関するテストをしていますhttp://ark.intel.com/products/36549/Intel-82945GSE-Graphics-and-Memory-Controller

また、私はSFMLを使ってシェイダーを実行しています。

答えて

4

intelに従って、GMA 950はハードウェアでシェーダモデル2をサポートし、ソフトウェアでシェーダモデル3をサポートします。 microsoftによれば、シェーダモデル2は、命令カウント(64ALU命令と32テックス命令)にかなり厳しい制限があります。

私が推測するのは、この命令数を超えると、インテルドライバがソフトウェアでシェーディングを行うことになります。これはあなたが見ている最悪のパフォーマンスに一致します。

sin関数が複数の命令に拡張される可能性があります。ループがアンロールされる可能性が高くなり、命令カウントが高くなり、上限が高くなります。ループの外側に33番目の乗算を追加しても、これが私には分かりません。

この問題を解決するかどうかを判断するには、unity hardware statssteam hardware surveyをお勧めします。簡単に言えば、シェーダモデル2はあなたがサポートする必要があるものではありません:)

関連する問題