私のCコードからPython関数を呼び出す必要があります。 これは完璧に動作しますが、並列化をしたいときは分解します。あなたはでそれをコンパイルすることができ、testPython.c
としてPythonをCから並列に呼び出す
#include <Python.h>
#include <stdio.h>
int main(void)
{
double Z = 1.;
double k = 1.;
double l = 1.;
double eta = -Z/k;
Py_Initialize();
PyObject* pName = PyString_FromString("mpmath");
PyObject* pModule = PyImport_Import(pName);
PyObject* pFunc = PyObject_GetAttrString(pModule, "coulombf");
PyObject* pl = PyFloat_FromDouble(l);
PyObject* peta = PyFloat_FromDouble(eta);
int i;
#pragma omp parallel for private(i)
for(i=0; i<10000; i++)
{
double r = 0.01*i;
PyObject* prho = PyFloat_FromDouble(k*r);
PyObject* pArgs = PyTuple_Pack(3, pl, peta, prho);
PyObject* pValue = PyObject_CallObject(pFunc, pArgs);
double value = PyFloat_AsDouble(pValue);
printf("r=%.2f\tf=%.6f\n",r,value);
}
Py_Finalize();
return 0;
}
レッツ・名前このファイル: には、以下の最小限のCコードを参照してください。
./testPython
で実行すると、このようなエラーが表示されます。Fatal Python error: GC object already tracked
(場合によっては、エラー情報が異なります)
しかし、コンパイルして-fopenmp
を残しておけば、プログラムは完全に動作します。
どうすればこの問題を解決できますか?ありがとう!
編集:Natecat、ジョン・ボリンジャー、およびオラフで答えたよう
、マルチスレッドは、多くのプロセスをスピードアップすることはほとんどありませんが、マルチプロセッシングは本当に計算をスピードアップすることができます。純粋なpythonスクリプトは次のように簡単です:
import numpy
from mpmath import coulombf
from multiprocessing import Pool
Z = 1.
k = 1.
l = 1.
eta = -Z/k
def coulombF(r):
return coulombf(l,eta,k*r)
pool = Pool(12)
result = pool.map_async(coulombF, numpy.arange(0.,100.,0.01))
print(result.get())
しかし、私はどのようにCでそれをしますか?私はまだ方法を見つけていない。
明確にするために、これはプロセスではなく別のスレッドを作成しようとしていますか? – Natecat
はい、OpenMPを使用して別々のスレッドを作成し、各スレッドはPython関数を呼び出します。 –