Я пытаюсь реализовать параллельный GEMM с помощью openMP и вызываю его из python с помощью ctypes. Во время выполнения кода монитор ресурсов показывает, что во время выполнения используется только 1 поток. Код c ++ и python выглядит следующим образом -
#include <cstddef>
#include <iostream>
#include <omp.h>
extern "C"
{
void parallelGemm(const double* a, const double* b, double* c, size_t arows, size_t acols, size_t bcols)
{
#pragma omp parallel for
for(int i=0;i<arows;i++)
{
for(int k = 0; k<acols; k++)
{
#pragma omp simd
for(int j = 0; j< bcols; j++)
{
c[i*bcols +j] += a[i*acols+k]*b[k*bcols+j];
}
}
}
}
}
, а код python -
import ctypes
import time
import numpy
from numpy.ctypeslib import ndpointer
import time
from numpy.ctypeslib import ndpointer
lib = ctypes.cdll.LoadLibrary('libtest.so')
fun = lib.parallelGemm
fun.restype = None
fun.argtypes = [ndpointer(ctypes.c_double, flags = "C_CONTIGUOUS"),
ndpointer(ctypes.c_double, flags = "C_CONTIGUOUS"),
ndpointer(ctypes.c_double, flags = "C_CONTIGUOUS"),
ctypes.c_size_t,
ctypes.c_size_t,
ctypes.c_size_t]
A = numpy.ones((5000, 10000))
B = numpy.ones((10000, 5000))
C = numpy.zeros((5000,5000))
print(A)
print('--------------------------------------')
s = time.time()
result = numpy.dot(A, B)
e = time.time()
print(result)
print('NUMPY.DOT TIME = ', e-s)
print('---------------------------------------')
arows = A.shape[0]
acol = A.shape[1]
bcol = B.shape[1]
s = time.time()
fun(A, B, C, arows, acol, bcol)
e = time.time()
print(C)
print('PARALLEL_GEMM TIME =', e-s)
print('---------------------------------------')
print(C-result)
Что здесь может быть причиной проблемы. TIA