From cf71f22c206a324638288ad2735b2cf2c816bb7b Mon Sep 17 00:00:00 2001 From: kojix2 <2xijok@gmail.com> Date: Thu, 29 May 2025 16:03:54 +0900 Subject: [PATCH 1/2] Use code block syntax in api.ja.me --- doc/api.ja.md | 238 ++++++++++++++++++++++++++++---------------------- 1 file changed, 134 insertions(+), 104 deletions(-) diff --git a/doc/api.ja.md b/doc/api.ja.md index e55d65e4..f32e3695 100644 --- a/doc/api.ja.md +++ b/doc/api.ja.md @@ -4,102 +4,120 @@ under development ## NArray演算の仕様 ### NArray Types - #define NARRAY_DATA_T 0x1 // データを保持する。contiguousアクセスのみ可能。 - #define NARRAY_VIEW_T 0x2 // データを保持しない。他のNArrayを参照。stride/index アクセスが可能 - #define NARRAY_FILEMAP_T 0x3 // ファイルマップ(TBI) + +```c +#define NARRAY_DATA_T 0x1 // データを保持する。contiguousアクセスのみ可能。 +#define NARRAY_VIEW_T 0x2 // データを保持しない。他のNArrayを参照。stride/index アクセスが可能 +#define NARRAY_FILEMAP_T 0x3 // ファイルマップ(TBI) +``` ### Loop Rule - method( a[nz,1,nz], b[nz,ny,1] ) => c[nz,ny,nx] + +```text +method( a[nz,1,nz], b[nz,ny,1] ) => c[nz,ny,nx] +``` + * サイズ1の次元は、1エレメントを繰り返し参照される。外積のようなもの * すべての演算・メソッドについて同様のルールが適用 ### Inplace - a.inplace + b => a に結果が保存される + +```ruby +a.inplace + b # => a に結果が保存される +``` ## NArrayメソッド定義の例 単純なループ演算を行うイテレータ関数を定義し、 -ndfunc_alloc関数で ndfunc_t構造体に登録し、 -ndfunc_do関数で多次元ループ処理を行う。 +`ndfunc_alloc` 関数で `ndfunc_t` 構造体に登録し、 +`ndfunc_do` 関数で多次元ループ処理を行う。 配列のキャスト、出力配列の準備、および多次元ループ処理については、内部で自動的に行う。 - #define cT numo_cDFloat - // 最も内側のループごとに呼ばれるイテレータ関数 - static void - iter_dfloat_add(na_loop_t *const lp) - { - size_t n = lp->n[0]; - double *a = (double*)(lp->args[0].ptr + lp->args[0].iter[0].pos); - double *b = (double*)(lp->args[1].ptr + lp->args[1].iter[0].pos); - double *c = (double*)(lp->args[2].ptr + lp->args[2].iter[0].pos); - size_t i; - - for (i=0; in[0]; + double *a = (double*)(lp->args[0].ptr + lp->args[0].iter[0].pos); + double *b = (double*)(lp->args[1].ptr + lp->args[1].iter[0].pos); + double *c = (double*)(lp->args[2].ptr + lp->args[2].iter[0].pos); + size_t i; + + for (i=0; i Date: Thu, 29 May 2025 16:24:38 +0900 Subject: [PATCH 2/2] Update api.ja documentation with additional details --- doc/api.ja.md | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/doc/api.ja.md b/doc/api.ja.md index f32e3695..87e94d13 100644 --- a/doc/api.ja.md +++ b/doc/api.ja.md @@ -1,10 +1,13 @@ # API of Next NArray + under development ## NArray演算の仕様 ### NArray Types +NArrayの型は、以下の3つのタイプに分類される。 + ```c #define NARRAY_DATA_T 0x1 // データを保持する。contiguousアクセスのみ可能。 #define NARRAY_VIEW_T 0x2 // データを保持しない。他のNArrayを参照。stride/index アクセスが可能 @@ -13,6 +16,8 @@ under development ### Loop Rule +NArrayの演算は、以下のルールに従って行われる。 + ```text method( a[nz,1,nz], b[nz,ny,1] ) => c[nz,ny,nx] ``` @@ -22,15 +27,19 @@ method( a[nz,1,nz], b[nz,ny,1] ) => c[nz,ny,nx] ### Inplace +NArrayの演算は通常、新しい配列を生成する。`inplace`メソッドを使うと、元の配列に直接結果を保存する。 + ```ruby a.inplace + b # => a に結果が保存される ``` ## NArrayメソッド定義の例 -単純なループ演算を行うイテレータ関数を定義し、 -`ndfunc_alloc` 関数で `ndfunc_t` 構造体に登録し、 -`ndfunc_do` 関数で多次元ループ処理を行う。 +ここでは、NArrayのメソッド `+` を定義する例を示す。 + +単純なループ演算を行うイテレータ関数 `iter_dfloat_add` を定義し、 +ループの仕様を記録するための `ndfunc_t` 構造体を定義する。 +`na_ndloop` 関数で多次元ループ処理を行う。 配列のキャスト、出力配列の準備、および多次元ループ処理については、内部で自動的に行う。 ```c @@ -61,6 +70,7 @@ nary_dfloat_add_self(VALUE self, VALUE other) return na_ndloop(&ndf, 2, self, other); } +// ほかのNArray型との演算を行うためのキャストと演算を行う関数 static VALUE nary_dfloat_add(VALUE self, VALUE other) { @@ -177,7 +187,7 @@ VALUE na_ndloop4(ndfunc_t *nf, void *opt_ptr, VALUE args) 配列情報を格納した `na_loop_t` 構造体へのポインタが引数として渡される。 ```c -例: iter_dfloat_add(na_loop_t *const lp) +iter_dfloat_add(na_loop_t *const lp) ``` ### na_loop_t 構造体 @@ -209,4 +219,4 @@ typedef struct NA_LOOP_ITER { ssize_t step; size_t *idx; } na_loop_iter_t; -``` \ No newline at end of file +```