問題タブ [spmd]
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.
matlab - Skipping lines of code depending on available function(s)/toolboxes
Context
At work I built a GUI to perform image registration on several microscopy images. On the computer I'm using (i.e. at work) the Parallel Processing Toolbox is installed, so I can take advantage of spmd blocks to distribute the work on the computer's cores.
First I create a codistributed array to split my array into smaller chunks:
All is well until I run the code on my own laptop, on which the Parallel Processing Toolbox is not installed. Obviously I can't use spmd
blocks and codistributed arrays so I wrote non-parallelized code to register the images, which works equally well but takes longer to execute.
The problem
The problem I'm having is that the code in spmd
blocks needs to be commented when I'm using my home laptop, otherwise Matlab complains that:
So even if I check whether I have the PP toolbox installed (or not) and use a condition to execute different commands depending on whether it is or not as follows:
Matlab won't evaluate the condition of the if
statement and will throw the error I mentioned above. This is quite cumbersome since every time I use the code on my laptop I need to comment all the lines generating the error (there are many of them) and vice versa when I'm at work.
Question
Is it possible to avoid commenting the code manually and make Matlab don't bother about codistributed arrays when it is running on a computer on which the PP toolbox is not installed?
Maybe I missed something obvious in the debugging world but I can't get around it.
I'm running on Mac if that can be useful (R2015a at work and R2013a at home).
EDIT
To clarify the situation:
The error pops up before any line of code is executed at all. I guess Matlab parses the whole code before executing any of it, so the only way I can avoid it is to comment it. That does not happen with other functions (in this case the classic undefined function [...]
appears) but I can avoid it with the if/else
statement. It really is the codistributed
term that Matlab does not like.
matlab - 並列処理を使用した MATLAB 配列構造のベクトル化
Matlab で次のデータ構造をベクトル化しようとしていますが、効率的な方法を見つけたりコーディングしたりできません。
A = 1x2 フィールドを持つ構造体配列: [a , b , c]
A(1) = a: 1 , b: 2 , c: [1x1 構造体]
A(1).c = キー: 5
A(2) = a : 1 , b: [] , c: [1x3 struct]
A(2).c = フィールドを持つ 1x3 構造体配列: [key , key2]
A(2).c(1).key = 3
A(2). c(2).key = 4
A(2).c(3).key = 7
A(2).c(1).key2 = 10
A(2).c(2).key2 = []
A( 2).c(3).key2 = 17
知っている。これは非常に非効率的なデータ構造です。そのため、インデックスを使用してベクトル化しようとしているため、最終的な構造は
A = 1x1 構造のフィールド [a 、 b 、 c 、 b_index 、 c_index]
Aa = [1 1]
Ab = [2]
A.b_index =のようになります。 [1]
Ac = フィールドを持つ 1x1 構造 [key key2 key2_index]
A.c_index = [1 2 2 2]
Ackey = [5 3 4 7]
Ackey2 = [10 17]
Ackey2_index = [2 4]
私の試み 1:
最初に各レベル (この例では、具体的には A、c、キー 3 レベル) で parfor を試し、最初に調査を行って、それが空かどうか、含まれているデータを確認しました。これにインデックスを付ける必要がありますか?分野。構造体の葉でない場合は vertcat(x.(fieldname)) です。しかし、そうであれば、セルとしてパッケージ化し、再帰的にプッシュダウンしてベクトル化します。
それは機能しますが、残念ながら時間がかかりすぎます。プロファイルを作成すると、常に使用されている mex 分布関数が表示されました。これは、すべてのレベルで parfor を実行しているためだと推測しています。そのため、MATLAB はすべてのレベルで非常に頻繁に各ワーカーにインデックスを付けて配布する必要があります。
私の試み2:
私は最初に完全に構造の parfor 調査をしようとしました。各フィールドに uint8 値を使用します。そして、結合段階で、まず vertcat を使用して調査結果をチェックし、インデックスを作成する必要があるかどうか、およびデータ フィールドに対して cat(3,...) を実行する必要があるかどうかを確認します。しかし、それはメモリの効率が悪く、調査段階では遅いです。そして、合体段階ではあまりスピードアップしません。インデックス作成ははるかに簡単になりますが。
私の質問は
1だと思います。最初の試行がより効率的になるように、parforのみがインデックスを作成して配列全体を1回配布するようにコーディングするにはどうすればよいですか、それとも2回目の試行がより良いアイデアですか?
2. 問題に対する適切な一般的なアプローチは何ですか?
opencl - OpenCL で SIMD を最大限に活用するには?
Intel GPU を対象とした OpenCL のオープンソース実装である Beignetの最適化ガイド
ワーク グループ サイズは 16 より大きく、16 の倍数にする必要があります。
Gen で可能な 2 つの SIMD レーンは 8 または 16 です。SIMD レーンを無駄にしないために、このルールに従う必要があります。
Intel Processor Graphics Gen7.5の Compute Architecture にも記載されています。
Gen7.5 ベースの製品の場合、各 EU には合計 28K バイトの汎用レジスタ ファイル (GRF) 用に7 つのスレッドがあります。
...
Gen7.5 コンピューティング アーキテクチャでは、ほとんどの SPMD プログラミング モデルで、このスタイルのコード生成と EU プロセッサの実行が採用されています。事実上、各SPMD カーネル インスタンスは、独自の SIMD レーン内でシリアルかつ独立して実行されているように見えます。
実際には、各スレッドは SIMD 幅の数のカーネル インスタンスを同時に実行します。したがって、計算 カーネルの SIMD-16 コンパイルの場合、SIMD-16 x 7 スレッド = 112 個のカーネル インスタンス が単一の EU で同時に実行される可能性があります。同様に、SIMD-32 x 7 スレッドの場合、1 つの EU で同時に実行される 224 個のカーネル インスタンス。
例として使用して正しく理解した場合SIMD-16 x 7 threads = 112 kernel instances
、1 つの EU で 224 のスレッドを実行するには、ワーク グループのサイズを 16 にする必要があります。その後、OpenCL コンパイラは 16 のカーネル インスタンスを 16 レーンの SIMD スレッドに折りたたみ、これを行います。 7 つの作業グループで 7 回、単一の EU で実行しますか?
質問 1:ここまでは正しいですか?
ただし、 OpenCL 仕様ではベクトル データ型も提供されます。そのため、従来の SIMD プログラミング (NEON や SSE など) によって、EU の SIMD-16 コンピューティング リソースを最大限に活用することが可能です。
質問 2:この場合、vector-16 データ型を使用すると、すでに SIMD-16 リソースが明示的に使用されているため、ワーク グループごとに少なくとも 16 項目の制限が削除されます。これは事実ですか?
質問 3:上記のすべてが当てはまる場合、2 つのアプローチは互いにどのように比較されますか? 2) vector-16 データ型と SIMD-16 演算を明示的に使用するようにコード化された 7 つのネイティブ スレッド?
matlab - Matlab で spmd (並列計算) を使用する場合の待機
spmd
2 つの異なるタスクをコンピューターの 2 つのプロセッサに分散するために使用しています。コードは次のようなものです。
各タスクはファイルを開いて処理し、結果を保存します。処理するファイルがまだある間、ループが続行されます。私の問題は、TASK_ONE
処理するファイルが少なく、終了するとコードが停止することです (spmd
ブロックを終了します)。したがって、TASK_TWO
はすべてのファイルの処理を終了しません。既に終了していても、終了spmd
するまで実行し続ける方法はありますか?TASK_TWO
TASK_ONE
matlab - 配布された画像を matlab で処理する
クラスターで画像処理を行っていますが、最適なパフォーマンスに失敗しました。エッジを複製する関数と、フィルターまたはマスクを適用する別の関数がありますが、MATLAB SPMD の実行時にプログラムを使用すると、それぞれが満たされません。時間の経過とともに増加する労働者。
マスカラを塗る機能です