2012-02-29 4 views
2

カーネルはスレッドごとに54個のレジスタを使用し、占有率は0.33です。これは、デバッグ目的のために、その中にif文があります。私はこのif文をコメントアウトした場合より良い占有率でカーネルの実行時間をどのように増やすことができますか?

if (-1 == val) // val is INT32 
{ 
    printf("Invalid value!\n"); 
} 

を、カーネルは、スレッドごとに33個のレジスタを使用し、占有率も0.5に改善されます。しかし、奇妙な部分は、この新しいより希薄なカーネルが実際に実行するために15%多くの時間を要するということです!その他のコードと起動パラメータ(ブロック、スレッド)はすべて定数です。どのようにこのパフォーマンスの低下が起こる可能性が誰に説明できますか?

私はGTX 580でCUDA 4.0を使用しています。コードはCUDAケイパビリティ2.0にコンパイルされています。

+1

まず、カーネルの実行速度が遅くなっていますか?具体的には、どのように時間を測定しましたか?そしてあなたの打ち上げのパラメータは何ですか? – harrism

+2

私は鉱山と港の間を走る列車を知っています。列車は、鉱山から港まで鉱石で満たされているよりも、港から鉱山へと空になった燃料を使用します。それはなぜ疑問に思う?答えは私があなたに話していないものです。この質問はほとんど同じです。答えは、あなたが私たちに言わなかったことにはっきりとあります。あなたがこれまで提供してきた情報よりも多くの情報なしでは、答えが非常に難しいでしょう。 – talonmies

+0

HarrisM:私はCUDAプロファイラからこのカーネルの時間を見ているので、間違っているとは思わない。私は、<<< 512, 256 > >>と100万の要素を持つデータを公開しています。 –

答えて

1

Ashwin、アルゴリズム、起動パラメータ、その他の詳細情報を提供できますか?Visual Profiler v4.1とParallel Nsightの両方で、ボトルネックの特定に役立つ追加のメトリックがあります。

理論的占有率は、SMがレイテンシをどの程度うまく隠すことができるかを抽象的に測定したものです。占有量を一定以上に増やしてもパフォーマンスは向上せず、パフォーマンスに影響する可能性があります。たとえば、占有量を増やすと、L1バイト/スレッドの数が減少します。見るべき項目の1つがキャッシュヒット率です。

+0

Greg:両方のバージョンの起動パラメータは<<< 512, 256 > >>です。私のアプリケーションのカーネル呼び出しの数は実行ごとに若干異なるので、キャッシュメトリックを収集することはできません。 –

+0

Greg:カーネルの両方のバージョンで生成されたPTXコードも比較しました。 vprintfの呼び出し以外に何も目立たない。 –