問題タブ [jocl]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Mac での JOCL のヘルプ
このチュートリアルを Mac で実行しようとしています。
このチュートリアルは Windows 用であり、jocl バージョン 1.3 (JOCL-0.1.3a-beta.jar) と Windows 用のネイティブ jocl dll (JOCL-windows-x86_64.dll) がパックされています。
コードを取得した後、基本的に jocl 1.3 jar と dll を取り除き、最新の jocl 1.4 jarに置き換えました。これは、Mac と Windows の両方のリソースをパックする必要があります。
これを行った後、チュートリアルを実行すると、次のエラーが表示されます。
libJOCL -apple-x86_64.dynlib動的ライブラリーが jar のリソースから欠落しているようです。
私は Java の専門家ではないので、次に何を試せばよいかわかりません。
どんな助けでも大歓迎です!
cuda - JOCL を使用して GPU で使用可能なグローバル メモリを決定しますか?
GPUで実行されているJOCl.org(jogamps joclとは異なります)を書いています。GPU のグローバル メモリ制限を超えないように注意する必要がある十分なデータを処理していました。これを行うには、GPU のメモリ量をプログラムで判断する方法が必要です。これを行うには単純なJOCLメソッド/変数が必要だと思いますが、何らかの理由でそれが何であるかを理解できないようです。CL.CL_MEM_SIZE と CL_DEVICE_GLOBAL_MEM_CACHE_SIZE を見てきましたが、どちらも 4100 前後の値を返します。私は現在、512 MB を含むと思われるグラフィックス カードで作業していることを知っています。
また、必要なほど多くのメモリを使用できないようです。私の最悪のシナリオでは、2^22 float のフレームを処理するカーネルを実行する必要があり、内部的にフレーム サイズの 2 倍のデータが必要になります。2 つのフレームをキャッシュしようとすると (つまり、2 フレーム * 2^22 * 2^2 バイト/フロート * オーバーヘッドの 2 = 2^26)、問題なくキャッシュできますが、キャッシュを増やすと、一度に 3 つのフレームを処理することになります。 time (または 2^25*3) メモリが不足しているようです。ただし、512 MB のグローバル メモリのうち 100 までしか使用しない方がよいと思います。使用されていないときにメモリを適切に解放していると思いますが、どうやら何か間違っているか、GPU の宣伝されている 512 MB を誤解しているようです。この混乱を説明できる人はいますか?
実際のメモリ使用量を把握するために GPU をプロファイリングする方法はありますか?
optimization - JNCI/JCOL カーネルの最適化
オープン CL で (jocl フロント エンドを介して) カーネルを実行していますが、他のカーネルに比べて実行速度が非常に遅いため、高速化する理由と方法を理解しようとしています。このカーネルは非常に基本的なものです。唯一の仕事は、持っているサンプル ポイントの数を減らすことです。入力配列から N 番目ごとのポイントをより小さな出力配列にコピーして、配列サイズを縮小します。
カーネルには、「適切な」ポイント間でスキップするポイント数を指定する float が渡されます。したがって、1.5 を超えると、1 ポイント、10 ポイントを 2 つ、次に 1 ポイントをスキップして、スキップされる 1.5 ポイントごとの平均を維持します。入力配列は既に GPU 上にあり (以前のカーネルによって生成されたものです)、出力配列はカーネル上にとどまるため、CPU との間でデータを転送する費用はかかりません。
このカーネルは、他のどのカーネルよりも 3 倍から 5 倍遅く実行されます。一部の高速カーネルよりも 20 倍も遅くなります。配列へのアクセスを結合しないことでペナルティを受けていることに気付きました。しかし、それが私をこれほど遅く走らせる原因になるとは信じられません。他のすべてのカーネルが配列内のすべてのサンプルに触れた後、たとえ合体していなくても、配列内の X サンプルに触れることは、少なくとも配列内のすべてのサンプルに触れるのとほぼ同じ速度になるはずです。
元のカーネルは実際には、実データと虚データの 2 つの配列を一度にデシメートしていました。カーネルを 2 つのカーネル呼び出しに分割しようとしました。しかし、これはまったく役に立ちませんでした。同様に、1 つのスレッドが 3 ~ 4 ポイントの間引きを担当するようにして、カーネルを「展開」しようとしました。しかし、これは何の役にも立ちませんでした。各カーネル呼び出しに渡されるデータのサイズをいじってみました (つまり、何千ものデータ ポイントに対する 1 つのカーネル呼び出し、または少数のデータ ポイントに対するいくつかのカーネル呼び出し)。しかし、このカーネルが GPU に実装する価値があると見なされるために必要な桁数ではありません。
スケール感を示すために、このカーネルは反復ごとに実行に 98 ミリ秒かかりますが、FFT は同じ入力配列サイズで 32 ミリ秒しかかからず、他のすべてのカーネルは 5 ミリ秒以下かかります。このような単純なカーネルの実行が、実行中の残りのカーネルに比べて馬鹿げたほど遅いのは、他に何が原因でしょうか? GPUで実行することを保証するために、実際にこのカーネルを十分に最適化できない可能性はありますか? このカーネルを CPU よりも高速に実行する必要はありません。CPU に比べてそれほど遅くはないので、GPU ですべての処理を維持できます。
opencl - JOCL による GPU プログラミングは、80 個のシェーダー コアのうち 6 個しか使用しないのですか?
GPU でプログラムを実行し、簡単なサンプルから始めて、 http://www.jocl.org/samples/samples.htmlの最初のサンプルを変更し、次の小さなスクリプトを実行しようとしています: n を実行します。同時「スレッド」 (スレッドに相当する GPU の正しい名前は何ですか?)、それぞれが 20000000/n の独立した tanh() 計算を実行します。ここで私のコードを見ることができます: http://pastebin.com/DY2pdJzL
速度は私が期待したものとはかけ離れています:
- n=1 の場合、12.2 秒かかります
- n=2 の場合、6.3 秒かかります
- n=3 の場合、4.4 秒かかります
- n=4 の場合、3.4 秒かかります
- n=5 の場合、3.1 秒かかります
- n=6 以上の場合、2.7 秒かかります。
したがって、n=6 (n=8、n=20、n=100、n=1000、n=100000 のいずれであっても) の後では、パフォーマンスは向上しません。つまり、これらのうち 6 つだけが並列に計算されます。ただし、私のカードの仕様によれば、80 コアがあるはずです: http://www.amd.com/us/products/desktop/graphics/ati-radeon-hd-5000/hd-5450-overview/pages/hd -5450-overview.aspx#2
20000000 の増加または減少は、すべての実行時間の線形要因にすぎないため、オーバーヘッドの問題ではありません。
OpenCLをサポートする AMD APP SDK とドライバーをインストールしました。詳細 (または少なくとも、これらから OpenCL が正しく実行されていると結論付けます)。
そのため、どこで答えを探すべきか、今は少しわかりません。ATI Radeon HD 5450 で JOCL が 6 つの並列実行しかできないのはなぜですか?
memory - OpenCL: JOCL でローカル メモリを使用する方法
大きな固定オブジェクト、たとえば固定された大きなスパース (有向) グラフ、または同様の種類のオブジェクトに対して並列計算を実行したいとします。
グラフ内のランダム ウォークなど、このグラフまたはオブジェクトに対して適切な計算を行うために、グラフをグローバル メモリに配置することは、おそらく速度上の理由から問題外です。
これにより、ローカル/プライベート メモリが残ります。GPU アーキテクチャが正しいことを理解していれば、ローカル メモリとプライベート メモリの (読み取り専用) アクセスの間に実質的に速度の違いはありませんか? グラフをプライベート メモリにコピーすることには消極的です。これは、すべてのワーク ユニットがグラフ全体を格納する必要があることを意味し、GPU のメモリを非常に急速に消費する可能性があるためです (非常に大きなグラフの場合は、コアの数を減らしても使用したり、OS を不安定にしたりする可能性があります)。
では、ローカル対プライベートの読み取り速度について上記が正しいと仮定すると、実際にこれを行うにはどうすればよいでしょうか? たとえば単純化のために、グラフを anint[] from
と an int[] to
(各有向辺の開始と終了を格納する) に縮小すると、もちろん、カーネルを次のようにすることができます。
ただし、プライベート/ローカル/グローバル修飾子が指定されていないため、JOCL からこれを呼び出す方法がわかりません。
ローカル変数は、各ローカル ワークグループのメモリに自動的に書き込まれますか? または、これはどのように機能しますか?このメモリ割り当てを正しく行う方法がまったくわかりません。
java - jocl.org からダウンロードした JOCL サンプルを実行できません。(Java の OPENCL)
jocl.orgからサンプル ファイルをダウンロードし、問題なくコンパイルしました ( c:\javac -cp c:\jocl.jar JOCLSample.java
)
実行しようとすると ( c:\java -cp c:\jocl.jar JOCLSample
)、いくつかのエラーが発生しました。
これを修正するにはどうすればよいですか?
java - gpgpu で多数のベクトル計算を行う最良の方法は?
100 万列 x 100 万行のマトリックスがあります。
私のアルゴリズムは次のことを行う必要があります:
または、次のように言うこともできます。
私の質問: この問題のためにメモリを割り当ててメモリを初期化する適切な方法は何
ですか?
-または、ベクトルのリストにメモリを割り当ててから、このリストをループする必要がありますか?
-それとも??
私の懸念は、GPU への転送時間を最小限に抑えたいということです。JCublas の hello world の例を 2 つのベクトルでの sgemm 操作に変更して、この種の計算を試みましたが、多数のベクトルで実行すると、転送時間がかかり、gpu アクセラレーションの利点が失われました。
どうも!PS: 実装は任意の Java ライブラリにある可能性があります
java - Java:多次元配列を1次元配列にキャストまたは参照します
大量の多次元配列を含むJavaで書かれたプログラムがあります。JOCL(OpenCL)を使用して並列化しようとしていますが、OpenCLに渡す前に、多次元配列を1次元配列に変換する必要があります。
1次元配列を使用してプログラム全体を書き直す以外に、他の解決策はありますか?
java - Java OpenCL: JOCL でカーネルにスカラー パラメータを渡す
新しい配列を作成せずにJOCLでカーネルにスカラーパラメータを渡す方法はありますか? C++ では、スカラー パラメーター (int など) を単純に void* にキャストできます。
java - JOCL を使用した Java OpenCL: ダイレクト バッファとは?
clEnqueueReadBuffer を試していたときに、例外が発生しました。
スレッド「メイン」の例外 java.lang.IllegalArgumentException: 非ブロッキング読み取り操作は、ダイレクト バッファへのポインタを使用してのみ実行できます
この行で:
zCacheMem が cl_mem の場合、zCachePtr は int[] を指しています。
このエラーを説明するドキュメントが見つかりません。誰か助けてくれませんか?