2017-01-06 2 views
0

私は2つのプログラムをゼロから作成しました.1つは積分と2つめの行列 - 行列乗算です。私がGPUカードで両方のプログラムを実行していて、グローバルサイズを1024に設定したとき、カーネルコードが1024回実行されると予想していましたが、それは正しいです。グローバルサイズを設定し、結果をコード化して出力することは重要ではありませんでした。 同じコード私はCPUで実行しようとしましたが、カーネル関数がグローバルサイズと同じ時間を実行していないのを見たときに私はショックを受けました。 グローバルサイズ= 2048、ローカルサイズ= 1、 カーネル関数の実行は2048回、2048, ですが、グローバルサイズ= 2048、ローカルサイズ= 16の場合それは256回実行されます... それは正常ですか? openClでCPUとの作業がGPUと異なるのはなぜですか?ユーザー側でどのデバイスを使用するかは問題ではなく、同じコードが異なるデバイスで同じように動作するはずです。私は間違っていますか?OpenCL GPUとCPUは同じアルゴリズムですが、OpenClはこれらの2つのデバイスで異なって動作します

ありがとうございました!

+0

問題の[最小、コンパイル可能な例(http://stackoverflow.com/help/mcve)]が必要です。したがって、いくつかのコードを投稿して、どのようにエンキューするのか(そしてOpenCLドライバなど)一般的に、ドライバはグリッド全体が実行されることを保証します。 – einpoklum

+0

グローバルスレッドIDとグループIDとローカルスレッドIDの間違った傍受が必要です。あなたはどのように処刑の回数を確認していますか? –

+0

@huseyintugrulbuyukisikカーネルコードのグローバル変数に+ = 1を追加するだけで、カーネルが何回実行されたかを確認できます。 – Gzyniu

答えて

0

シリアル作業(または少なくとも簡単に還元できない作業)にアトミック操作を使用します。仕事や偶数の整数である

atomic_inc(a) 

より良いはずです a[0]+=1;

atomic_add(&a[0],1); 

を使用していない、スレッドが参加したどのように多く数えるために、未署名の署名することは重要ではありません。

+0

いいえ、はい、atomic_incはうまく動作しません。私はそれが仕事をして、価値を増やすことを意味しますが、この値は最終的にグローバルサイズとは異なります。私はそれを得ることはできませんが、私は完全に1,2、または8 gpuで動作するコードを持っていますが、私はCPU(clgetDeviceIds引数をCL_DEVICE_TYPE_CPUに変更するのを忘れていませんでした)にスウィッチしたとき、 GPUの代わりにCPUを使って作業することについて何か違うことはありますか? – Gzyniu

+0

私は別の結果で問題を解決しましたが、CPUとGPUの動作に問題があります。私はint型のid = get_global_id(0)を持っています。グローバルサイズを極端に大きく設定しても、すべてのスレッドは小さな作業になりますが、CPU上ではlocal_size = 4096 (それは最大です)カーネルには0から4095の番号のスレッドがあります...なぜですか?私はローカルではないグローバルIDをフェッチしています... GPUでは、ローカルサイズが1に設定され、1024に設定されていても問題は見られませんでした。何故ですか? – Gzyniu

+0

idは0から始まります –

0

私はこの問題の原因を発見しました。それは浮動小数点の精度が悪いため、変数を二重に変更してもうまく動作するためです。私は、浮動小数点演算の観点からCPUとGPUのどこかを読んでいますが、精度に関しては少し違いがあります。

関連する問題