使用模板类型减少 OpenMP
OpenMP reduction with template type
template <typename T, std::size_t N>
static T sum(const std::array<T, N>& a)
{
T result;
// type of result (T) is not determined when pre-process?
#pragma omp parallel for reduction(+: result)
for(int i = 0; i < static_cast<int>(N); i++)
{
result += a[i];
}
return result;
}
我可以使用 MSVC 和 gcc 编译和运行上面的代码。是的,非常棒!
但我的问题在代码注释中;"由于结果类型 (T( 不是在预处理'#pragma'时确定的,因此编译器如何验证结果类型是否适合 OpenMP 缩减?
我确定如果 T=double,如果 T=std::string 是可以的,但是预处理器如何知道 T 的类型?
我记得很久以前我无法使用一些小的 c++ 编译器编译上面的代码。
让我问一下在 C++/OpenMP 规范的上下文中哪种行为(可编译或不可编译(是正确的。
它未指定(对于OpenMP 3.0或更高版本(或未定义(对于OpenMP 2.5(
reduction
是数据共享属性子句之一,OpenMP 应用程序接口版本 2.5 说:
2.8.3 数据共享属性子句
---- C/C++ ----
如果数据共享属性子句中引用的变量具有派生自模板的类型,并且程序中没有对该变量的其他引用,则与该变量相关的任何行为都是未定义的。
---- C/C++ ----
OpenMP 应用程序程序接口版本3.0说:
2.9.3 数据共享属性子句
---- C/C++ ----
如果数据共享属性子句中引用的变量具有派生自模板的类型,并且程序中没有对该变量的其他引用,则未指定与该变量相关的任何行为。
---- C/C++ ----
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 共享或私有 openmp 代码中的结构化类型变量
- 使用MPI/OpenMP的C 程序带有派生数据类型(嵌套类对象)容器
- openMP 的 SIMD 结构是否需要特定类型的硬件?
- 是否无法对长双数据类型执行openMP矢量化操作
- 使用模板类型减少 OpenMP
- 使用OpenMP的复杂类型
- OpenMP引用类型
- 在c++ STL类型的静态实例上使用OpenMP threadprivate指令