Juliaで複数のブロードキャストを高速化する方法

パウジエ

このJulia関数は非常に非効率的であるようです(Juliaのウォームアップ後でも、同等のPythran / C ++コードよりも1桁遅い)...

function my_multi_broadcast(a)
    10 * (2*a.^2 + 4*a.^3) + 2 ./ a
end

arr = ones(1000, 1000)
my_multi_broadcast(arr)

正しく書いていないだけだと思います…ジュリアでこんな「マルチ放送」をどうやってスピードアップできるのでしょうか?私はループを費やす必要がないと思います/願っています...

最初の回答の後に編集する

ありがとうございました!私のセットアップでは、Pythranソリューション(インプレースおよびアウトオブプレース)は、(OpenMPなしで)1.5〜2倍高速です。JuliaでSIMD命令をアクティブにする方法はありますか?または、そのようなCPU計算を高速化する別の方法はありますか?

Pythonコード:

from transonic import jit

@jit
def broadcast(a):
    return 10 * (2*a**2 + 4*a**3) + 2 / a

@jit
def broadcast_inplace(a):
    a[:] = 10 * (2*a**2 + 4*a**3) + 2 / a

@simd提案後に編集する

@simdそのままでは機能しないようです。つまり、行の先頭に追加するだけでは機能しません。

ERROR: LoadError: LoadError: Base.SimdLoop.SimdError("for loop expected")
Stacktrace:
 [1] compile(::Expr, ::Bool) at ./simdloop.jl:54
 [2] @simd(::LineNumberNode, ::Module, ::Any) at ./simdloop.jl:126
 [3] include at ./boot.jl:317 [inlined]
 [4] include_relative(::Module, ::String) at ./loading.jl:1044
 [5] include(::Module, ::String) at ./sysimg.jl:29
 [6] exec_options(::Base.JLOptions) at ./client.jl:231
 [7] _start() at ./client.jl:425

forループを拡張する必要があると思いますが、そうすると、コードは(i)読みにくくなり、(ii)次元から独立しなくなります。

単純なPython / NumpyコードがPythranでJuliaよりも速く加速できる場合があるようです(Juliaでこれを加速する方法があり、将来のJuliaバージョンでこれが解決される可能性がある場合を除く)。面白い...

BogumiłKamiński

次のようなすべての操作をブロードキャストします。

julia> function my_multi_broadcast2(a)
           @. 10 * (2*a^2 + 4*a^3) + 2 / a
       end
my_multi_broadcast2 (generic function with 1 method)

違いは、2つ10 * (2*a.^2 + 4*a.^3) + 2 ./ aブロードキャストされないため、実際にはブロードキャストフュージョンを利用しないことです。*+

書くこと@. 10 * (2*a^2 + 4*a^3) + 2 / aはと同等10 .* (2 .* a.^2 .+ 4 .* a.^3) .+ 2 ./ aです。

そしてここにパフォーマンスの比較があります

julia> @btime my_multi_broadcast($arr);
  58.146 ms (18 allocations: 61.04 MiB)

julia> @btime my_multi_broadcast2($arr);
  5.982 ms (4 allocations: 7.63 MiB)

約10倍のスピードアップが得られるので、Pythran / C ++と比較してどうですか?

最後に、次のように記述して、そのarr場で変更できる場合は注意してください

julia> function my_multi_broadcast3(a)
           @. a = 10 * (2*a^2 + 4*a^3) + 2 / a
       end
my_multi_broadcast3 (generic function with 1 method)

julia> @btime my_multi_broadcast3($arr);
  1.840 ms (0 allocations: 0 bytes)

これはさらに高速で、割り当てはゼロです(そのarr場で変更するのか、新しい配列を作成するのかわからないので、両方のアプローチを示します)。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ブロードキャストを使用してこのコードを高速化するにはどうすればよいですか?

分類Dev

NumPyでブロードキャストを使用して、この相関計算を高速化するにはどうすればよいですか?

分類Dev

複数の IF ステートメントを使用してコードを高速化する方法

分類Dev

SQL Server 2008R2でストアドプロシージャを高速化する方法

分類Dev

Http.Clientを使用してPythonで複数のシーケンシャルhttpリクエストを高速化する方法

分類Dev

Pythonで複数の内積を高速化する方法

分類Dev

複数のCTEでクエリを高速化する方法

分類Dev

表示を高速化するために、既知の境界のLeafletタイルをブラウザキャッシュにプリロードする方法は?

分類Dev

複数のIPを使用すると、ダウンロードを高速化できますか?

分類Dev

Pythonでの起動と使用を高速化するためのJuliaモジュールのキャッシュ

分類Dev

ストアドプロシージャでの反復挿入プロセスを高速化するにはどうすればよいですか?

分類Dev

Juliaのセットの配列でセット操作をブロードキャストする方法は?

分類Dev

UICollectionViewのスクロールを高速化する方法

分類Dev

マングースの一括ドキュメント更新を高速化する方法

分類Dev

複数のネストされたforループを使用してPython2プログラムを高速化する方法

分類Dev

複数の参照があるテーブルからの削除を高速化する方法

分類Dev

複数のインターフェースでUDPブロードキャストを送受信するサービスを作成する方法

分類Dev

複数のJTextFieldの描画を高速化する方法は?

分類Dev

複数のスレッドを使用して計算を高速化する方法は?

分類Dev

R:複数のifステートメントを高速化します

分類Dev

「移動する」球内の複数の配列間でデータを検索するコードのランタイムを高速化する方法

分類Dev

8086アセンブリでのキーボードスキャンコード検出の高速化

分類Dev

MySQLデータベースからの複数の結合を高速化するためのヒント

分類Dev

テキストのスクロールを高速化

分類Dev

行のないドキュメントの削除を高速化する方法

分類Dev

Juliaでベクター(リスト)をタプルにブロードキャストする方法は?

分類Dev

コードを高速化するためのオブジェクトのインスタンス化

分類Dev

データテーブルで逆行を見つけるプロセスを高速化する方法

分類Dev

Goの複数のチャネルを介してチャネルをブロードキャストする

Related 関連記事

  1. 1

    ブロードキャストを使用してこのコードを高速化するにはどうすればよいですか?

  2. 2

    NumPyでブロードキャストを使用して、この相関計算を高速化するにはどうすればよいですか?

  3. 3

    複数の IF ステートメントを使用してコードを高速化する方法

  4. 4

    SQL Server 2008R2でストアドプロシージャを高速化する方法

  5. 5

    Http.Clientを使用してPythonで複数のシーケンシャルhttpリクエストを高速化する方法

  6. 6

    Pythonで複数の内積を高速化する方法

  7. 7

    複数のCTEでクエリを高速化する方法

  8. 8

    表示を高速化するために、既知の境界のLeafletタイルをブラウザキャッシュにプリロードする方法は?

  9. 9

    複数のIPを使用すると、ダウンロードを高速化できますか?

  10. 10

    Pythonでの起動と使用を高速化するためのJuliaモジュールのキャッシュ

  11. 11

    ストアドプロシージャでの反復挿入プロセスを高速化するにはどうすればよいですか?

  12. 12

    Juliaのセットの配列でセット操作をブロードキャストする方法は?

  13. 13

    UICollectionViewのスクロールを高速化する方法

  14. 14

    マングースの一括ドキュメント更新を高速化する方法

  15. 15

    複数のネストされたforループを使用してPython2プログラムを高速化する方法

  16. 16

    複数の参照があるテーブルからの削除を高速化する方法

  17. 17

    複数のインターフェースでUDPブロードキャストを送受信するサービスを作成する方法

  18. 18

    複数のJTextFieldの描画を高速化する方法は?

  19. 19

    複数のスレッドを使用して計算を高速化する方法は?

  20. 20

    R:複数のifステートメントを高速化します

  21. 21

    「移動する」球内の複数の配列間でデータを検索するコードのランタイムを高速化する方法

  22. 22

    8086アセンブリでのキーボードスキャンコード検出の高速化

  23. 23

    MySQLデータベースからの複数の結合を高速化するためのヒント

  24. 24

    テキストのスクロールを高速化

  25. 25

    行のないドキュメントの削除を高速化する方法

  26. 26

    Juliaでベクター(リスト)をタプルにブロードキャストする方法は?

  27. 27

    コードを高速化するためのオブジェクトのインスタンス化

  28. 28

    データテーブルで逆行を見つけるプロセスを高速化する方法

  29. 29

    Goの複数のチャネルを介してチャネルをブロードキャストする

ホットタグ

アーカイブ