0

約 113 の t を除いて、次のような長い一連の方程式があります。

t1 = L1;
t2 = L2 + 5;
t3 = t2 + t1;
t4 = L3
...
t113 = t3 + t4
return t113;

Lは入力引数です。

を計算するのに非常に時間がかかりますt113。そのため、これをより速くするために、これをいくつかの異なるスレッドに分割しようとしています。問題は、これを行う方法がわからないことです。よりよく分析できるように、紙に木の形で t を手書きしてみましたが、途中で大きくなりすぎて扱いにくくなりました。

計算を高速化する他の方法はありますか? ありがとう。

編集: SYS/BIOS で 8 コア DSP を使用しています。私の前任者によると、これらの逆運動方程式と順運動方程式は、処理に最も時間がかかります。私の先人も、この 8 コア DSP を実装用のハードウェアとして意図的に選択しました。したがって、8 つのコアすべてを活用する方法でコードを作成する必要があると想定しています。

4

4 に答える 4

1

タスクは時間がかかり、それ以上のL2 + L3ものだと思います。そうでない場合、スレッド化のオーバーヘッドは、スレッド化の最小の利益を大幅に超えます。

これがJavaの場合、Executors.newCachedThreadPool();必要に応じて新しいスレッドを開始し、ジョブ自体がスレッドプールにジョブを送信して応答を待つことを許可するを使用します。少し変わったパターンですが、うまくいきます。

例えば:

private final ExecutorService threadPool = Executors.newCachedThreadPool();
...
public class T3 implements Callable<Double> {
    public Double call() throws Exception {
        Future<Double> t2 = threadPool.submit(new T2());
        Future<Double> t1 = threadPool.submit(new T1());
        return t2.get() + t1.get();
    }
}

次に、最終的なタスクは次のようになります。

Future<Double> t3 = threadPool.submit(new T3());
// this throws some exceptions that need to be caught
double result = t3.get();
threadPool.shutdown();

その後、スレッド プールが結果を処理します。できる限り多くの並列化を行います。タスクの出力がT1複数の場所で使用された場合、これは機能しません。

これが別の言語の場合、使用可能なスレッド ライブラリによっては、同様のパターンを使用できる可能性があります。

于 2013-05-02T18:33:14.163 に答える