我整理了一个模拟我正在处理的数据结构类型的示例程序.也就是说我有n对象,我需要在每个可能的对之间迭代一次并执行(对称)计算.此操作涉及将数据写入两对.在串行中,这将采用这样的循环形式
for(int i = 0; i < N-1; ++i)
for(int j = i + 1; j < N; ++j)
...
Run Code Online (Sandbox Code Playgroud)
然而,它并没有在互联网上寻找一个"缓存无关的并行实现",我在下面写下并转载.我在这里链接了一个帖子(使用英特尔TBB),详细描述了这个算法.
我尝试使用OpenMP任务来执行相同的操作,并且它总是比串行对应物运行得慢(只是在没有-fopenmp的情况下编译).我用它编译它g++ -Wall -std=c++11 -O3 test.cpp -o test.无论是否观察到相同的情况-O3; 串口总是更快.
为了添加更多信息,在我的实际应用程序中,通常有几百到几千个元素(n下面的例子中的变量),我需要多次以这种成对的方式循环.数百万次.我下面的尝试试图模拟(虽然我只尝试循环10-100k次).
我非常粗暴地使用它,time ./test因为它有很多不同之处.是的,我知道我的例子编写得很糟糕,并且我在我的例子中包含了创建向量所需的时间.但串行的时间给了我大约30秒和一分钟的时间,所以我认为我还不需要做更严格的事情.
我的问题是:为什么序列会做得更好?我在OpenMP中做错了吗?如何正确纠正我的错误?我误用了任务吗?我有一种感觉,递归任务与它有关,我尝试将'OMP_THREAD_LIMIT'设置为4,但它没有产生实质性的区别.有没有更好的方法使用OpenMP实现这一点?
注意:我的问题是具体询问如何修复此特定实现,以便它可以并行正常工作.虽然如果有人知道这个问题的替代解决方案及其在OpenMP中的正确实现,我也对此持开放态度.
提前致谢.
#include <vector>
#include <iostream>
std::vector<std::vector<double>> testme;
void rect(int i0, int i1, int j0, int j1)
{
int di = i1 - j0;
int dj = j1 - j0;
constexpr int threshold …Run Code Online (Sandbox Code Playgroud) 我想问一个关于如何最好地构建一个类的对象的设计问题,我想拥有可搜索的字段,包括作为对象的字段 - 但也是模块化的,在某种意义上,可以根据数据库中的新条目添加字段.让我澄清一下:
假设我有一个对象类型,Car.汽车具有诸如品牌,型号,颜色,最高速度等属性,可以通过简单类型(如字符串和双打等)来表示.但它也可能包含更复杂的信息,例如类型为CarPowerProfile(一个单独的对象)的属性,保持一个方程式,描述车辆的功率输出作为节气门的函数.或者也许是其他子对象.
设计这样一个类的最佳方法是什么,这样我就可以搜索数据库,不仅可以搜索颜色,品牌和型号这样的简单属性,还可以说"找到一辆蓝色的汽车,它的含量在70%到90%之间"功率输出为30%油门"?问题是,我需要执行计算以获取该信息的对象,并且数据库仅存储等式的系数.
另外,假设有人想要向对象添加属性(除了硬编码的"基本属性"),如何最好地实现这样,以便新属性同时在数据库和加载的对象中?最后,这个问题最适合关系数据库或非关系数据库,请记住,这将是一个与Web服务同步的独立应用程序.
我意识到我要求很多,但我不是在寻找代码讲义,而是更多的是如何设计解决方案 - 这就是为什么我使用的是单词而不是代码来描述问题.我来自数值计算的背景,这种类型的软件设计对我来说很陌生.我更感兴趣的是,如果有类似这样(或类似的)的设计模式,或者可能是一种不同的方法,因为我正在解决问题.
谢谢!