お問い合わせいただきありがとうございます。ご質問の件について回答いたします。
Pythonから共有ライブラリをロードできない件になりますが、
nccはベクトルエンジン(VE)用のオブジェクト/バイナリを生成するコマンドになっています。
ホスト(VH)側で動作するPythonスクリプトからnccでコンパイルされた共有ライブラリを
直接ロードすることはできません。
PythonからVE用の共有ライブラリを実行する方法は2通りございます。
ご不便をおかけしますが、以下いずれかの方法をご検討お願い致します。
(1) PythonライブラリNLCPyを利用する方法
NLCPyはNumPy-likeなAPIをVE上で実行するPythonライブラリです。
https://sxauroratsubasa.sakura.ne.jp/documents/nlcpy/ja/index.html
NLCPyの機能を利用することで、VE向けにコンパイルされた共有ライブラリをロードして実行することが可能になります。
https://sxauroratsubasa.sakura.ne.jp/documents/nlcpy/ja/reference/jit/index.html
お使いのPython環境にpipコマンドからインストールすることが可能です。
$ pip3 install nlcpy
以下、NLCPyからnccでコンパイルされた共有ライブラリを呼び出す簡易的なサンプルになります。
・ソースコード
$ cat vehello.c
#include <stdio.h>
void print_hello(int x)
{
printf("hello world VE %d\n", x);
}
$ cat hello_nlcpy.py
import nlcpy
lib_vehello = nlcpy.jit.CustomVELibrary(path='./libvehello.so')
print_hello = lib_vehello.get_function(
'print_hello',
args_type=(nlcpy.ve_types.int32,),
ret_type=nlcpy.ve_types.void
)
print_hello(10, sync=True)
・コンパイル
$ ncc -fpic -shared -o libvehello.so vehello.c
・実行
$ source /opt/nec/ve/nlc/2.3.0/bin/nlcvars.sh
$ python3 hello_nlcpy.py
hello world VE 10
(2) VEの共有ライブラリを呼び出すVHの共有ライブラリを作成し、ctypesから呼び出す方法
VHで動作するプログラムからVEの関数を呼び出すC APIとして、VE Offloading framework(VEO)が提供されています。
https://sxauroratsubasa.sakura.ne.jp/documents/veos/en/aveo/index.html
その他にCUDA-likeなAPIとして、VEDAが提供されています。
https://sxauroratsubasa.sakura.ne.jp/documents/veos/en/veda/index.html
これらの機能を利用してVHからVEの関数を呼び出す共有ライブラリを作成することで、ctypesから間接的にVEの関数を呼び出すことが可能になります。
以下、VEOを利用した場合の簡易的なサンプルになります。
VEDAを使ったサンプルについては割愛させていただきます。もしVEDAをご利用になる際は以下をご参照ください。
https://sxauroratsubasa.sakura.ne.jp/documents/veos/en/veda/md_GettingStarted.html
・ソースコード
$ cat vhhello.c
#include <ve_offload.h>
void call_hello(int x)
{
struct veo_proc_handle *proc = veo_proc_create(0);
uint64_t handle = veo_load_library(proc, "./libvehello.so");
struct veo_thr_ctxt *ctx = veo_context_open(proc);
struct veo_args *argp = veo_args_alloc();
veo_args_set_i32(argp, 0, x);
uint64_t id = veo_call_async_by_name(ctx, handle, "print_hello", argp);
uint64_t retval;
veo_call_wait_result(ctx, id, &retval);
veo_args_free(argp);
veo_context_close(ctx);
veo_proc_destroy(proc);
}
$ cat hello_veo.py
import ctypes
lib = ctypes.CDLL('./libvhhello.so')
lib.call_hello(10)
・コンパイル
$ gcc -fpic -shared -o libvhhello.so vhhello.c -I/opt/nec/ve/veos/include -L/opt/nec/ve/veos/lib64 \
-Wl,-rpath=/opt/nec/ve/veos/lib64 -lveo
$ ncc -fpic -shared -o libvehello.so vehello.c
※ vehello.cは(1)でご紹介したコードと同じ内容になります。
・実行
$ python hello_veo.py
hello world VE 10
また、Cのプログラムから共有ライブラリのロードに失敗してしまう件につきましては、
環境変数VE_LD_LIBRARY_PATHに共有ライブラリのパスが指定されていないことが原因と推測します。
環境変数LD_LIBRARY_PATHはVHで動作するプログラムに対するパス指定になっています。
お手数をおかけしますが、VEで動作するプログラムに対してはVE_LD_LIBRARY_PATHを設定した上で実行をお願い致します。
Posted by NEC SDK team (forum administrator) on 15 December 2022 at 08:56. Edited by NEC SDK team (forum administrator) on 15 December 2022 at 08:59. |
|