#pragma omp parallel для использования только 1 потока - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь реализовать параллельный 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

...