У меня есть этот простой код MATLAB, который вызывает imregionalmax
в параллельном цикле по 256 путям 16X16 пикселей.
function y = Parimregionalmax(x)
assert(isa(x,'uint8'));
assert( all(size(x)==[16 16 256]) );
y = zeros(size(x));
parfor k = 1:size(x,3)
y(:,:,k) = imregionalmax(x(:,:,k));
end
end
Передача этого кода в кодер MATLAB дает следующий код C:
/*
* Parimregionalmax.c
*
* Code generation for function 'Parimregionalmax'
*
*/
/* Include files */
#include "rt_nonfinite.h"
#include "Parimregionalmax.h"
#include "libmwimregionalmax.h"
/* Function Definitions */
void Parimregionalmax(const unsigned char x[65536], double y[65536])
{
int k;
int i0;
int i1;
double imSize[2];
unsigned char varargin_1[256];
boolean_T conn[9];//unsigned char
double connSize[2];
boolean_T BW[256];
#pragma omp parallel for \
num_threads(omp_get_max_threads()) \
private(i0,i1) \
firstprivate(varargin_1,imSize,conn,connSize,BW)
for (k = 0; k < 256; k++) {
for (i0 = 0; i0 < 16; i0++) {
for (i1 = 0; i1 < 16; i1++) {
varargin_1[i1 + (i0 << 4)] = x[(i1 + (i0 << 4)) + (k << 8)];
}
}
for (i0 = 0; i0 < 2; i0++) {
imSize[i0] = 16.0;
}
for (i0 = 0; i0 < 9; i0++) {
conn[i0] = true;
}
for (i0 = 0; i0 < 2; i0++) {
connSize[i0] = 3.0;
}
imregionalmax_uint8(varargin_1, BW, 2.0, imSize, conn, 2.0, connSize);
for (i0 = 0; i0 < 16; i0++) {
for (i1 = 0; i1 < 16; i1++) {
y[(i1 + (i0 << 4)) + (k << 8)] = BW[i1 + (i0 << 4)];
}
}
}
}
/* End of code generation (Parimregionalmax.c) */
Как видите, сгенерированный код (который отлично работает) использует платформу распараллеливания openmp и вызывает функцию imregionalmax_uint8
, которая реализована в отдельном dll «черного ящика» (с соответствующими заголовочными и lib файлами).
Могу ли я предположить, что эта функция всегда безопасна для потоков, независимо от того, какую платформу распараллеливания я использую?
Примеры:
1. Можно лиопределить два потока с помощью библиотеки C ++ <thread>
в консольном приложении (он же exe-файл в VS) и вызвать из каждого потока imregionalmax_uint8
?
Могут ли две отдельные библиотеки (загруженные exe-файлом) одновременно вызывать эту функцию?