草庐IT

PERFORMANCE

全部标签

c++ - 如何剖析 OpenMP 瓶颈

我有一个已由OpenMP并行化的循环,但由于任务的性质,有4个critical子句。分析加速并找出哪些关键子句(或可能非关键(!))在循环内占用最多时间的最佳方法是什么?我使用Ubuntu10.04和g++4.4.3 最佳答案 Scalasca是分析OpenMP(和MPI)代码和分析结果的好工具。Tau也很好,但更难使用。英特尔工具,如vtune,也不错,但非常昂贵。 关于c++-如何剖析OpenMP瓶颈,我们在StackOverflow上找到一个类似的问题:

c++ - 我们是否应该在大型 std::vector 中存储指向类实例的智能指针以获得更好的性能?

当在std::string中存储自定义类(不是“简单”类,例如不是std::complex,不是std::vector等)的大量实例时,我们应该选择一个简单的std::vector还是std::vector>是更好的选择?我写了一些基准代码(从thisblogpost扩展代码,关于C++11在C++03上move语义改进),似乎vector>为1,500,000项vector提供了更好的性能。事实上,在装有Windows764位、IntelCorei5四核CPU和8GBRAM的PC上,我得到了以下结果(test.exe1500):vector>:1.5秒vector>:1.6秒vect

C++ 引用与返回值

我理解引用的原则是避免复制大型结构,但如果您编写的函数本身创建了大型结构怎么办?在本地创建变量然后返回它是否比将目标对象作为引用传递并从函数内部填充它效率低(或者您更有可能耗尽内存)?我似乎不能很好地表达,所以举一个具体的例子:假设一个函数接受一个字符串,并返回字符串中每一行的vector。该功能是否具有物质优势:voidgetLines(std::stringin,std::vector&out);结束:std::vectorgetLines(std::stringin);感谢您的帮助,怀亚特 最佳答案 第一个示例大概应该更像是这

c++ - 64位系统的优点

我想从开发人员的角度理解,64位系统的卖点是什么?我知道更多的寄存器可供您使用,更多的内存可以分配给一个进程,但我不明白是什么让开发人员的生活更轻松。有什么例子吗?从性能的角度来看,如果一个程序在32位和64位上运行有什么好处吗?干杯!编辑:感谢您的所有回复。我看到一些针对最终用户体验的对话,尽管它可能很重要。我更多地关注您可以挤出的任何架构优势。据我了解,似乎优化主要集中在编译器-汇编程序链中,而不是程序员可以调用的功能? 最佳答案 当您可以使用64位地址空间时,您可以采用某些在地址空间较小的情况下会非常困难的设计。例如,一位fr

c++ - 传递引用的开销是多少?

当有问题的getter返回引用时,访问成员变量的开销有多大?例如,如果您有一个需要相当频繁地使用此类访问器的类,那么将所述引用存储在需要使用它的类中并简单地初始化一次会更有效率吗? 最佳答案 关于复杂性,返回或传递引用就像传递指针一样。它的开销相当于传递一个指针大小的整数,再加上一些指令。简而言之,几乎在所有情况下都尽可能快。小于或等于指针大小的内置类型(例如int、float)是明显的异常(exception)。在最坏的情况下,传递/返回引用可以添加一些指令或禁用一些优化。这些损失很少超过按值返回/传递对象的成本(例如,调用复制构

c++ - OpenMP 中的共享 vector

我正在尝试并行化我正在使用的程序并遇到以下问题。如果多个线程需要在同一个vector但vector的不同元素上读/写,我会失去性能吗?我觉得这就是我的程序在并行化后几乎没有变得更快的原因。采取以下代码:#includeintmain(){vectornumbers;vectorresults(10);doublex;//write10valuesinvectornumbersfor(inti=0;i显然实际程序执行的操作要昂贵得多,但是这个例子应该只解释我的问题。那么for循环是否可以快速且完全并行地完成,或者不同的线程是否必须相互等待,因为一次只有一个线程可以访问vector编号,例

C++ 更快地进行字符串加法?

我发现标准的字符串添加非常慢,所以我正在寻找一些可以加快我的一些代码速度的技巧/技巧。我的代码基本结构如下:inlinevoidadd_to_string(stringdata,string&added_data){if(added_data.length()在进行一些基本分析时,我发现for循环中使用了大量时间。我可以做些什么来显着加快速度吗?使用C字符串而不是C++字符串会有帮助吗? 最佳答案 字符串添加不是您面临的问题。std::stringstream因其设计而闻名。在for循环的每次迭代中,stringstream至少负责

c++ - 加速 C/Rcpp 中 Dice 系数的计算

我需要计算一个相似性度量,称为R中二进制vector的大型矩阵(600,000x500)上的Dice系数。为了提高速度,我使用C/Rcpp。该功能运行良好,但由于我不是背景计算机科学家,我想知道它是否可以运行得更快。此代码适合并行化,但我没有并行化C代码的经验。Dice系数是相似性/不相似性的简单度量(取决于您如何看待)。它旨在比较不对称二元vector,这意味着其中一个组合(通常为0-0)并不重要,并且一致(1-1对)比不一致(1-0或0-1对)具有更大的权重。想象一下以下列联表:101ab0cd骰子系数为:(2*a)/(2*a+b+c)这是我的Rcpp实现:library(Rcpp

c++ - 为什么 std::vector 这么快(或者我的实现太慢了)

前几天我在玩游戏,想看看我能优化到什么程度。我决定从一个简单的map开始,它只进行线性搜索以查找元素是否存在,然后尝试优化其中的大部分内容。此外,为了进行比较,我使用std::find对std::map和std::vector执行相同的操作。map的结果是预期的,创建和销毁比我的map慢,但速度快得多(实际上,我一直无法测量它,它总是返回0)。问题在于std::vector。我预计它会比我的实现慢,但事实并非如此,而且我真的不明白它怎么可能相同或更快,因为我的实现跳过了最坏的情况(值不在vector中)并且是使用结果缓存。任何人都可以在这里阐明一些问题吗?我知道STL背后的家伙是半神,

java - 多线程循环的效率

问候贵族社区,我想要以下循环:for(i=0;i这将在使用线程的共享内存四核计算机上并行运行。对于这些线程要执行的代码,正在考虑以下两个备选方案,其中tid是线程的ID:0、1、2或3。(为简单起见,假设MAX是4的倍数)选项1:for(i=tid;i选项2:for(i=tid*(MAX/4);i我的问题是是否有一种比另一种更有效,为什么? 最佳答案 第二个比第一个好。简单答案:第二个最小化falsesharing现代CPU不会将一个字节一个字节地加载到缓存中。它在称为缓存行的批处理中读取一次。当两个线程试图修改同一缓存行上的不同变