6

私は現在、理論計算機科学の研究を行っています。私が使用している主なツールの1つはプロローグです。推測を反証するための非常に迅速なテストを書くのに特に便利だと思いました。

しかし、力ずくの検索が遅くなりすぎているところまで来ました。私は別の言語を使用することもできますが、プロローグを使用することの全体的なポイントは、仮説をテストするためのコードを書くことが非常に高速で簡単であるということです。

自動並列化を可能にするPrologの実装はありますか?非常に高速である必要はありませんが、理想的には、コードをドロップして少なくとも少しスピードアップできるものを探しています。

これが可能かどうかはわかりません。グーグル検索はPrologの自動並列処理に関する多くの学術記事を明らかにしました、しかし私はどんな実装にも出くわしませんでした。しかし、私は実際にはSWI-prologに精通しているだけなので、多くの実装に精通している誰かからのアドバイスを確実に使用できます。

私のコードはカットを使用していますが、カットを削除できると確信しています。IOに関しては、唯一のIOはコンソールへの印刷であり、おそらく並列コードの外部に移動できます。

4

3 に答える 3

6

「少なくとも少しスピードアップする」ために並列処理が必要ですか?

あなたはSWI-Prologにしか精通していないと言っているので、他のPrologシステムを試してみてください。http://www.probp.com/performance.htmのベンチマークの結果(特定の問題に関連する場合と関連しない場合があります)によると、B-Prolog、YAP、およびSICStus-Prologを試してください(これは無料ではありません)。運が良ければ、Prologシステムを切り替えるだけで数倍のスピードアップを得ることができます。

スピードアップするためのもう1つの可能な低コストの方法-タブリングサポート(B-Prolog、XSB、またはYAP)を備えたシステムを使用し:- auto_table.、プログラムの最初の行のようなものを追加するだけです。問題と既存のプログラムによっては、大幅なスピードアップが得られます(またはまったくスピードアップされません)。

于 2013-02-26T21:19:53.820 に答える
5

Prologでは、並列処理を見つけることは難しくありません。どちらを使用するかを選択することは困難です;)。

たぶん、Parlog-並列実行用に設計されたロジックベースのプログラミング言語が役に立ちます。Windowsの実装はありますが、複数のコアを使用しているかどうかはわかりません。ただし、そこで作成者に連絡することはできます。

于 2013-02-26T09:10:32.613 に答える
0

Jekejeke Prologでは、プログラマーにとって可能な限りシンプルにすることを試み、balance/1と呼ばれるシンプルな構成を提供しました。balance / 1を使用すると、問題の生成とテストが行​​われます。

 /* sequential */
 ?- Generate, Test.

複数のスレッドに分散されます。呼び出しは、接続詞を述語balance/1にラップするのと同じくらい簡単です。結果は、いくつかの並べ替えを受ける可能性があります。

 ?- use_module(library(runtime/distributed)).

 /* parallel */
 ?- balance((Generate, Test)).

素数の並列生成の例を次に示します。シーケンシャルコードは次のようになります。

:- use_module(library(advanced/arith)).

prime(N) :-
    M is floor(sqrt(N)),
    between(2,M,K),
    N mod K =:= 0, !, fail.
prime(_).

?- time(aggregate_all(count, 
                     (between(1,1000000,X), prime(X)), N)).
% Up 6,737 ms, GC 33 ms, Thread Cpu 6,656 ms (Current 07/16/19 01:49:02)
N = 78499

同じことを並行して行うと、次のようになります。

?- time(aggregate_all(count, 
                      balance((between(1,1000000,X), prime(X))), N)).
% Up 4,167 ms, GC 39 ms, Thread Cpu 219 ms (Current 07/16/19 01:49:50) 
N = 78499

そのため、問題が複数のスレッドで実行される可能性があるため、スピードアップがありました。

于 2019-07-15T17:03:42.433 に答える