jjzjj

c++ - 为什么这个 OpenMP 程序比单线程程序慢?

请看这段代码。单线程程序:http://pastebin.com/KAx4RmSJ.编译:g++-lrt-O2main.cpp-onnlv2带openMP的多线程:http://pastebin.com/fbe4gZSn编译:g++-lrt-fopenmp-O2main_openmp.cpp-onnlv2_openmp我在双核系统上对其进行了测试(因此我们有两个并行运行的线程)。但是多线程版本比单线程版本慢(而且显示时间不稳定,多运行几次)。怎么了?我哪里弄错了?一些测试:单线程:LayersNeuronsInputs---Time(ns)10200200---189898310500

c++ - 使用 openmp 遍历 map

我正在尝试使用openMP在C++中迭代map,但我收到了三条错误消息我的循环的初始化、终止和增量形式不正确,而且我在使用openmp方面还很陌生,那么有什么办法可以解决这个问题,同时获得与串行循环相同的结果吗?以下是我使用的代码map::iteratordatIt;#pragmaompparallelforfor(datIt=dat.begin();datIt!=dat.end();datIt++)//constructthedistancematrix{...............} 最佳答案 这也可以通过使用一个简单的基于索

C++ + openmp 并行计算 : how to set up in visual studio?

我有一个C++程序,它创建一个对象,然后调用该对象的两个相互独立的函数。所以它看起来像这样:Objectmyobject(arg1,arg2);doubleanswer1=myobject.function1();doubleanswer2=myobject.function2();我想让这2个计算并行运行以节省计算时间。我已经看到这可以使用openmp来完成,但无法弄清楚如何设置它。我发现的唯一示例是将相同的计算(例如“helloworld!”)发送到不同的核心,输出是“helloworld!”的2倍。在这种情况下我该怎么做?我使用WindowsXP和VisualStudio2005

c++ - std::vector push_back 在并行 for 循环中使用时失败

我有一个代码如下(简化代码):for(inti=0;i此代码运行良好,但如果我想使用ompparallelfor使其并行,我会在output.push_back上收到错误,并且似乎在调整vector大小期间,内存已损坏。问题是什么,我该如何解决?如何确保在任何时候只有一个线程将新项目插入vector? 最佳答案 简单的答案是std::vector::push_back不是线程安全的。为了安全地并行执行此操作,您需要同步以确保不会同时从多个线程调用push_back。C++11中的同步可以通过使用std::mutex轻松实现。

c++ - 嵌套并行级别的 omp critical 行为

考虑以下场景:函数A创建一层OMP并行区域,每个OMP线程调用函数B,函数B本身包含另一层OMP并行区域。然后,如果在函数B的并行区域内,存在一个OMP临界区域,那么,该区域对于函数A和B创建的所有线程来说是“全局”临界的,还是仅对函数B是局部的?如果B是预构建函数(例如静态或动态链接库)怎么办? 最佳答案 OpenMP中的关键区域具有全局绑定(bind),它们的范围扩展到所有出现的具有相同名称的关键构造(在这方面,所有未命名的构造共享相同的特殊内部名称),无论它们出现在代码中的何处。您可以在OpenMPspecification的

c++ - 竞争条件会降低代码的性能吗?

我正在运行以下矩阵乘法代码,我应该测量其性能:for(intj=0;j是的,我知道它真的很慢,但这不是重点-它纯粹是为了性能测量目的。我正在运行3个版本的代码,具体取决于我放置#pragmaomp指令的位置,因此也取决于并行化发生的位置。代码在MicrosoftVisualStudio2012中以Release模式运行,并在CodeXL中进行分析。我从测量中注意到的一件事是代码片段中的选项(在k循环之前并行化)是最慢的,然后是在j循环之前带有指令的版本,然后是在我循环。所提供的版本也是由于竞争条件而计算出错误结果的版本——多个线程同时访问结果矩阵的同一单元格。我理解为什么i循环版本是最

c++ - vector 乘法中的 SIMD 与 OMP

在我的项目中,我必须做几个vector乘法,在double*a-vectors或float*a-vectors上完成。为了加快速度,我想使用SIMD操作或omp。为了获得最快的结果,我写了一个基准程序:#include#include#include#include#include#include#include#defineSIZE32768#defineROUNDS1e5voidmultiply_singular(float*a,float*b,float*d){for(inti=0;i(t2-t1).count();std::cout(t2-t1).count();std::co

c++ - 如何在 OpenMP 4 中为 std::vector 写入 "target data map"?

我想使用C++和vectors。我有C代码和这样创建的C数组:double*data=(double*)malloc(sizeof(double)*n);double*result=(double*)malloc(sizeof(double)*n);#pragmaomptargetdatamap(tofrom:data[0:n],result[0:n])//loop现在我使用C++vector,我得到:example.cpp:31:41:error:expectedvariablenameoranarrayitem#pragmaomptargetdatamap(tofrom:data[

c++ - 使用 4 和 8 线程运行的相同时间执行

我使用OpenMP测试了一些代码。在这里:#include#include#include#defineNUM_THREADS8#defineARR_SIZE10000classA{private:inta[ARR_SIZE];public:A(){for(inti=0;ivoidfn(A&o1,A&o2){intsome=0;#pragmaompparallelnum_threads(NUM_THREADS){#pragmaompforreduction(+:some)for(inti=0;ielapsed=end-start;std::cout执行时间:1个线程:0.233663秒

c++ - 错误 "undefined reference to omp_get_wtime"

我找不到要在Windows下的GCC(4.8)中链接的库(Vista)。我尝试了-fopenmp-llibgomp-lgomp编译器指令,但没有任何效果。我已经有了带POSIX的GCC(所以如果启用C++11,std::thread可以正常工作)。问题似乎是搜索正确的库并没有提供有用的结果(甚至在GCC/MinGW文档中搜索)。所以基本上我无法得到thisanswer工作(答案声称适用于大多数编译器,但它没有提供有关如何使其工作的额外信息,因此我无法验证它是否真的工作)。最好现在提供额外的信息以使其在大多数系统上运行...... 最佳答案