草庐IT

OPTIMIZATION

全部标签

c++ - 如何有效地计算小于或等于给定数字的 2 的最高幂?

这个问题在这里已经有了答案:Roundinguptonextpowerof2(31个回答)Whatisthefastest/mostefficientwaytofindthehighestsetbit(msb)inanintegerinC?(30个回答)关闭5年前.到目前为止,我想出了三个解决方案:极其低效的标准库pow和log2函数:int_fast16_tpowlog(uint_fast16_tn){returnstatic_cast(pow(2,floor(log2(n))));}计算2的后续幂直到我达到比我必须达到的更大的数字:uint_fast16_tmultiply(uin

c++ - 如何有效地计算小于或等于给定数字的 2 的最高幂?

这个问题在这里已经有了答案:Roundinguptonextpowerof2(31个回答)Whatisthefastest/mostefficientwaytofindthehighestsetbit(msb)inanintegerinC?(30个回答)关闭5年前.到目前为止,我想出了三个解决方案:极其低效的标准库pow和log2函数:int_fast16_tpowlog(uint_fast16_tn){returnstatic_cast(pow(2,floor(log2(n))));}计算2的后续幂直到我达到比我必须达到的更大的数字:uint_fast16_tmultiply(uin

c++ - 每微秒 1,000,000,000 次计算?

好的,我一直在和friend讨论编译器和程序优化,他建议n*0.5比n/2快。我说编译器会自动做那种优化,所以我写了一个小程序,看看n/2和n*0.5有没有区别:部门:#include#includeintmain(intargc,constchar*argv[]){inti,m;floatn,s;clock_tt;m=1000000000;t=clock();for(i=0;i乘法:#include#includeintmain(intargc,constchar*argv[]){inti,m;floatn,s;clock_tt;m=1000000000;t=clock();for(

c++ - 每微秒 1,000,000,000 次计算?

好的,我一直在和friend讨论编译器和程序优化,他建议n*0.5比n/2快。我说编译器会自动做那种优化,所以我写了一个小程序,看看n/2和n*0.5有没有区别:部门:#include#includeintmain(intargc,constchar*argv[]){inti,m;floatn,s;clock_tt;m=1000000000;t=clock();for(i=0;i乘法:#include#includeintmain(intargc,constchar*argv[]){inti,m;floatn,s;clock_tt;m=1000000000;t=clock();for(

c++ - 如何理解棘手的加速

抱歉这个问题可能太抽象了,但对我来说这很实用+可能有一些专家有类似的经验并且可以解释一下。我有一个大代码,大约10000行大小。我注意到如果我放在某个地方if(expression)continue;其中表达式总是假(用代码和cout的逻辑双重检查),但取决于未知参数(因此编译器在编译期间不能简单地去掉这一行)程序的速度增加25%(计算结果相同)。如果我测量循环本身的速度,则加速因子大于3。为什么会发生这种情况以及在没有这些技巧的情况下使用这种加速可能性的可能方法是什么?附:我使用gcc4.7.3,-O3优化。更多信息:我尝试了两种不同的表达方式,都有效。如果我将这一行改为:if(ex

c++ - 如何理解棘手的加速

抱歉这个问题可能太抽象了,但对我来说这很实用+可能有一些专家有类似的经验并且可以解释一下。我有一个大代码,大约10000行大小。我注意到如果我放在某个地方if(expression)continue;其中表达式总是假(用代码和cout的逻辑双重检查),但取决于未知参数(因此编译器在编译期间不能简单地去掉这一行)程序的速度增加25%(计算结果相同)。如果我测量循环本身的速度,则加速因子大于3。为什么会发生这种情况以及在没有这些技巧的情况下使用这种加速可能性的可能方法是什么?附:我使用gcc4.7.3,-O3优化。更多信息:我尝试了两种不同的表达方式,都有效。如果我将这一行改为:if(ex

c++ - 最大化调度具有依赖关系的单元任务的利润

问题我有n个作业要在P秒内安排在无限数量的机器上,这些机器之间存在依赖关系,即对于每个作业,都有一组作业,只有在该作业完成后才能安排这些作业。在任何机器上在第jth秒内调度第ith个作业的利润是f(i,j),它是正数。我的目标是通过在最多P秒内准确地安排每个作业一次来最大化总利润。我们可以假设所有作业总是可以在P秒内调度。一切都是预先知道的,即离线问题。还有0并且依赖的数量是O(n)。这个问题容易吗?[可能是由于有限的约束]我的方法为简单起见,首先假设一项工作的利润与时间无关。即f(i,j)对于所有i都独立于j并且仅依赖于i。然后任何适合P秒的拓扑排序都将起作用。如果没有依赖性,那么我

c++ - 最大化调度具有依赖关系的单元任务的利润

问题我有n个作业要在P秒内安排在无限数量的机器上,这些机器之间存在依赖关系,即对于每个作业,都有一组作业,只有在该作业完成后才能安排这些作业。在任何机器上在第jth秒内调度第ith个作业的利润是f(i,j),它是正数。我的目标是通过在最多P秒内准确地安排每个作业一次来最大化总利润。我们可以假设所有作业总是可以在P秒内调度。一切都是预先知道的,即离线问题。还有0并且依赖的数量是O(n)。这个问题容易吗?[可能是由于有限的约束]我的方法为简单起见,首先假设一项工作的利润与时间无关。即f(i,j)对于所有i都独立于j并且仅依赖于i。然后任何适合P秒的拓扑排序都将起作用。如果没有依赖性,那么我

c++ - 循环写入优化

尽管存在__restrict关键字,但将成员变量移动到局部变量会减少此循环中的写入次数。这是使用GCC-O3。Clang和MSVC在这两种情况下都优化了写入。[请注意,自从发布此问题以来,我们观察到将__restrict添加到调用函数会导致GCC也将存储移出循环。请参阅下面的上帝bolt链接和评论]classX{public:voidprocess(float*__restrictd,intsize){for(inti=0;i使用gcc-O3第一个有一个看起来像这样的内部循环:.L3:mulssxmm0,xmm1addrdi,4addssxmm0,DWORDPTR[rdi-4]movs

c++ - 循环写入优化

尽管存在__restrict关键字,但将成员变量移动到局部变量会减少此循环中的写入次数。这是使用GCC-O3。Clang和MSVC在这两种情况下都优化了写入。[请注意,自从发布此问题以来,我们观察到将__restrict添加到调用函数会导致GCC也将存储移出循环。请参阅下面的上帝bolt链接和评论]classX{public:voidprocess(float*__restrictd,intsize){for(inti=0;i使用gcc-O3第一个有一个看起来像这样的内部循环:.L3:mulssxmm0,xmm1addrdi,4addssxmm0,DWORDPTR[rdi-4]movs