7

これはリスクの高いビジネスであり、Global Interpreter Lock が並列処理の恐るべき敵であることを理解しています。ただし、NumPy の C API (具体的PyArray_DATAには NumPy 配列のマクロ) を使用している場合、複数の同時スレッドから呼び出すと、潜在的な結果はありますか?

私は引き続き GIL を所有し、NumPy のスレッド サポートでリリースしないことに注意してください。また、NumPy がスレッド セーフを保証していなくてもPyArray_DATA、実際にはスレッド セーフであっても、それで十分です

LinuxでNumPy 1.3.0を使用してPython 2.6.6を実行しています。

4

1 に答える 1

7

ここで自分の質問に答えますが、NumPy 1.3.0 のソース コードを調べた後、答えは「はい、PyArray_DATAスレッド セーフです」だと思います。

  1. PyArray_DATAndarrayobject.h で定義されています。

    #define PyArray_DATA(obj) ((void *)(((PyArrayObject *)(obj))->data))
    
  2. PyArrayObject 構造体型は同じファイルで定義されています。関心のある分野は次のとおりです。

    char *data;
    

    さて、問題はマルチスレッドからのアクセスdataが安全かどうかです。

  3. 新しい NumPy 配列をゼロから作成する (つまり、既存のデータ構造から派生させない)と、arrayobject.c で定義されNULLている にデータ ポインターが渡されます。PyArray_NewFromDescr

  4. これにより、 PyArray_NewFromDescrPyArrayObjectPyDataMem_NEWdataフィールドにメモリを割り当てるために呼び出されます。これは単純な malloc のマクロです。

    #define PyDataMem_NEW(size) ((char *)malloc(size))
    

要約すると、PyArray_DATAスレッドセーフであり、NumPy 配列が個別に作成されている限り、異なるスレッドから安全に書き込むことができます。

于 2010-12-05T11:30:37.393 に答える