c++ - "thread-safe"函数并行化框架是否依赖?

标签 c++ multithreading matlab c++11 openmp

我有这个调用 imregionalmax 的简单 MATLAB 代码在并行循环中 超过 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 的 Coder 可得到以下 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>控制台中的库 应用程序(又名 VS 中的 exe 文件)并从每个线程调用 imregionalmax_uint8

  1. 做两个独立的dll(通过exe文件加载)可以调用这个函数 同时?

最佳答案

是也不是。

不,因为几乎没有人会为这种事情写出好的保证。 This is a wonderful podcast about NVidia using C++'s threading model最终形成一个线程系统,提示说在 C++ 尝试之前,大多数抽象的线程/内存模型都是垃圾。充其量你会得到关于一组特定硬件的非常神秘和具体的信息,或者声称你像其他一些(通常更古老的)硬件一样工作。

除了 yes,因为在实践中,他们使用的互斥体和同步等类型将在几乎所有桌面系统上兼容。在移动计算 CPU 和其他更晦涩的系统上可能不那么重要。

关于c++ - "thread-safe"函数并行化框架是否依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52415500/

相关文章:

c++ - C/C++ 中的高效变量监视

c++ - 流程处理的封装会产生问题

c++ - 如何在 native C++ 中跨线程调用(在主线程上回调)

matlab - 检查每个像素的特定颜色(在特定阈值内)

c++ - 如何正确设置随机数生成器?

c++ - 从智能指针获取所有权,并通过同一智能指针进一步访问原始指针

c++ - 自动 void * 到 C++ 类转换

c++ - 多线程服务器问题

c# - 是否有可能在C#中的同一线程上同时运行两个任务?

matlab:粒子状态模拟