Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Cuda用カスタムオペレーターについて #1

Closed
YsYusaito opened this issue Nov 4, 2022 · 3 comments
Closed

Cuda用カスタムオペレーターについて #1

YsYusaito opened this issue Nov 4, 2022 · 3 comments

Comments

@YsYusaito
Copy link

Cuda用のカスタムオペレーターを実装するにはどのようにしたらよろしいでしょうか。

@maminus
Copy link
Owner

maminus commented Nov 4, 2022

カスタムオペレータをCUDAで実装したい、ということですよね?

細かい部分は環境やオペレータの内容に依存して内容が変わってくるので概要だけ以下に記載します。

全体的な考え方

  • C++の実装サンプルのうち、オペレータのコア処理(計算処理を実装している関数)をCUDAカーネルに置き換えます

ファイル構成

  • 新たに.cuファイルと.cuhファイルを追加します
    • fma_core()関数を.cuファイルに移動させます
      • 移動させるときにテンプレート関数から通常の関数に変更してください(分割コンパイルしたいので)
      • .cuファイル側でONNXRuntimeのヘッダファイルincludeも必要なので注意してください
      • この関数を改造してCUDAカーネル化します
    • .cuhファイルにはプロトタイプ宣言を入れて元のファイルからincludeするように変更します
    • CMakeLists.txtも変更が必要になりますが環境によって書き方が変わってくると思います

fma_core()関数をCUDA実装に変更する

  • fma_core関数のうち、計算処理は入力Cがあるケース入力Cがないケースの2か所です
    • 関数内の他の処理はONNXRuntimeのデータ型から生ポインタ(ptr_a, ptr_b, ptr_0 など)を取得する処理なのでそのままfma_core関数に残します
    • 上記2か所(ループで生ポインタ経由で計算している箇所)をCUDAカーネルにします

補足

  • 「ある処理をCUDAカーネル化する方法」についてはWebから検索してください
    • 例えばベクトル同士の加算をCUDA化するような例が参考になると思います

@YsYusaito
Copy link
Author

@maminus さん
はい、カスタムオペレータをCUDAで実装したいと考えております。
ご回答ありがとうございます。
以前よりだいぶ実装方法のイメージがわきました。

カスタムオペレータをCUDA実装に挑戦しようと思います。

@maminus
Copy link
Owner

maminus commented Jan 16, 2023

参考までに #2 でCUDA版カスタムオペレータのサンプルを追加しました。

また、ブログに簡単な解説記事を投稿しています。

こちらのIssueはいったんcloseします。

@maminus maminus closed this as completed Jan 16, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants