所以,我正在考虑对我拥有的 python 组件进行 C 扩展。然后,我想使用 OMP 来尽可能多地利用机器,这些机器最终将运行 Python+C 的组合解决方案。
有没有人尝试过类似的东西?是否有任何特殊的、不利的细节会使这样的解决方案失败?
提前致谢!
所以,我正在考虑对我拥有的 python 组件进行 C 扩展。然后,我想使用 OMP 来尽可能多地利用机器,这些机器最终将运行 Python+C 的组合解决方案。
有没有人尝试过类似的东西?是否有任何特殊的、不利的细节会使这样的解决方案失败?
提前致谢!
我已经成功地完成了射电天文学中的大型数据挖掘任务。有关示例,请参见https://github.com/ewanbarr/sigpyproc.git 。
需要注意的是,我在这些情况下构建的 C 库是通过 ctypes 访问的,而不是作为原生 Python 扩展。
因此,例如:
Python:测试.py
import ctypes as C
import numpy as np
from numpy.ctypeslib import as_ctypes
lib = C.CDLL("libmytest.so")
def set_N_threads(nthreads):
self.lib.omp_set_num_threads(nthreads)
def do_some_task(input_array):
input_array = input_array.astype("float32")
output_array = np.empty_like(input_array)
lib.do_some_omp_task(as_ctypes(input_array),
as_ctypes(output_array),
C.c_size_t(input_array.size))
return output_array
C:测试.c
#include <omp.h>
void do_some_omp_task(float* input_array,
float* output_array,
size_t size)
{
int ii;
#pragma omp parallel for default(shared) private(ii)
for (ii=0;ii<size;ii++)
do something using ii and the arrays
}
编译:
gcc -O3 -lm -fopenmp -fPIC -c test.c -o test.o
gcc -shared -lgomp -o libmytest.so test.o
要回答您的问题,我对这种设置没有任何问题,并且可实现的速度改进令人印象深刻(尽管上面的示例不会真正受益于 OMP)