110得票9回答
何时,如果有必要的话,循环展开仍然是有用的?

我一直在尝试通过循环展开来优化一些极其性能关键的代码(一个快速排序算法,在蒙特卡罗模拟中被调用数百万次)。这里是我试图加速的内部循环:// Search for elements to swap. while(myArray[++index1] < pivot) {} while(piv...

46得票1回答
#pragma unroll 究竟是做什么的?它会影响线程数吗?

我是CUDA的新手,不理解循环展开。我写了一段代码来学习这个技术。 __global__ void kernel(float *b, int size) { int tid = blockDim.x * blockIdx.x + threadIdx.x; #pragma unrol...

25得票2回答
使用g++进行聚合初始化的std::array生成了大量的代码

在g++ 4.9.2和5.3.1上,这段代码需要几秒钟来编译,并且产生一个大小为52,776字节的可执行文件: #include <array> #include <iostream> int main() { constexpr std::size_t s...

21得票3回答
如何阻止Clang在使用模板时过度展开嵌套循环?

考虑这段代码: #include <iostream> typedef long xint; template<int N> struct foz { template<int i=0> static void foo(xint t) { ...

19得票5回答
C/C++中的自解卷宏循环

我目前正在进行一个项目,每个循环都非常重要。在分析我的应用程序时,我发现某些内部循环的开销非常高,因为它们只由几条机器指令组成。此外,这些循环中的迭代次数在编译时已知。 所以我想,与其手动复制和粘贴展开循环,不如使用宏在编译时展开循环,这样可以轻松修改。 我想象的是这样的:#define ...

15得票2回答
如何使用g++向量化我的循环?

我在搜索时找到的介绍链接: 6.59.14 循环特定的 Pragmas 2.100 Pragma Loop_Optimize 如何告诉gcc循环次数 告诉gcc特定展开一个循环 如何在C++中强制使用向量化 正如您所看到的,它们大多是为C而设计的,但我认为它们在C++上也可能有效。 这...

15得票8回答
if和else if的替代方案

我有很多if、else if语句,我知道必须有更好的方法来做到这一点,但即使在搜索stackoverflow后,我仍不确定如何在我的特定情况下实现。 我正在解析文本文件(账单),根据账单上出现的特定字符串将服务提供商的名称赋值给变量(txtvar.Provider)。 以下是我正在做的小样...

13得票4回答
现代编译器能够展开使用begin和end迭代器表示的for循环吗?

考虑以下代码 vector<double> v; // fill v const vector<double>::iterator end =v.end(); for(vector<double>::iterator i = v.bgin(); i !...

13得票4回答
GCC如何展开循环,如果它的迭代次数在编译时是未知的?

我正在阅读GCC的优化选项时,发现了选项-funroll-all-loops。 它的描述如下: 展开所有循环,即使它们进入循环时迭代次数不确定。这通常会使程序运行更慢。 '-funroll-all-loops'意味着与'-funroll-loops'相同的选项 如果编译器无法...

11得票1回答
GCC中的循环展开行为

这个问题部分是关于GCC 5.1 循环展开的后续问题。 根据GCC文档和我对上述问题的回答,像-funroll-loops这样的标志会打开"完整的循环剥离(即完全删除少量迭代的循环)"。因此,当启用该标志时,编译器可以选择展开一个循环,如果它确定这将优化给定代码的执行。 尽管如此,我注意到...