Зависит ли структура параллелизации "потокобезопасных" функций? - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть этот простой код 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-файлом) одновременно вызывать эту функцию?

1 Ответ

0 голосов
/ 20 сентября 2018

Да и нет.

Нет, потому что рядом никто не пишет хороших гарантий для такого рода вещей. Это замечательный подкаст о том, как NVidia использует модель потоков C ++ , чтобы окончательно формализовать систему потоков, с жалобой на то, что до попыток C ++ большинство абстрактных моделей потоков / памяти там, где дерьмо.В лучшем случае вы получите очень таинственную и конкретную информацию о конкретном наборе оборудования или заявления о том, что вы работали как какое-то другое (обычно более древнее) оборудование.

Кроме да, потому что на практике виды мьютексови синхронизация и тому подобное, которые они используют, будут совместимы практически со всеми настольными системами.Возможно, в меньшей степени это касается мобильных вычислительных процессоров и других более сложных систем.

...