草庐IT

OPTIMIZATION

全部标签

c++ - make_shared<>() 中的 WKWYL 优化是否会为某些多线程应用程序引入惩罚?

几天前我碰巧看了StephanT.Lavavej的thisveryinterestingpresentation,其中提到了“WeKnowWhereYouLive”优化(抱歉在问题标题中使用了首字母缩写词,所以警告我否则问题可能已经关闭),以及HerbSutter在机器架构上的thisbeautifulone。简而言之,“WeKnowWhereYouLive”优化在于将引用计数器放置在与make_shared正在创建的对象相同的内存块上,从而导致一个单一的内存分配而不是两个,并使shared_ptr更紧凑。在总结了我从上面两个演示中学到的东西之后,我开始怀疑如果shared_ptr被多

c++ - make_shared<>() 中的 WKWYL 优化是否会为某些多线程应用程序引入惩罚?

几天前我碰巧看了StephanT.Lavavej的thisveryinterestingpresentation,其中提到了“WeKnowWhereYouLive”优化(抱歉在问题标题中使用了首字母缩写词,所以警告我否则问题可能已经关闭),以及HerbSutter在机器架构上的thisbeautifulone。简而言之,“WeKnowWhereYouLive”优化在于将引用计数器放置在与make_shared正在创建的对象相同的内存块上,从而导致一个单一的内存分配而不是两个,并使shared_ptr更紧凑。在总结了我从上面两个演示中学到的东西之后,我开始怀疑如果shared_ptr被多

c++ - 如何在汇编级别分析 C++ 函数?

我有一个功能是我的程序的瓶颈。它不需要访问内存,只需要计算。它是内部循环并被多次调用,因此对这个函数的任何小收获对我的程序来说都是巨大的胜利。我具有在PS3上优化SPU代码的背景,您可以在其中获取SPU程序并通过管道分析器运行它,您可以将每个汇编语句放在自己的列中,并最大限度地减少函数所花费的周期数。然后你覆盖循环,这样你就可以进一步减少管道依赖。有了这个程序和每条汇编指令所花费的所有周期的列表,我可以比编译器更好地优化。在不同的平台上,它有我可以注册的事件(缓存未命中、循环等),我可以运行该函数并跟踪CPU事件。那也不错。现在我正在使用带有Corei7Intel处理器的VisualS

c++ - 如何在汇编级别分析 C++ 函数?

我有一个功能是我的程序的瓶颈。它不需要访问内存,只需要计算。它是内部循环并被多次调用,因此对这个函数的任何小收获对我的程序来说都是巨大的胜利。我具有在PS3上优化SPU代码的背景,您可以在其中获取SPU程序并通过管道分析器运行它,您可以将每个汇编语句放在自己的列中,并最大限度地减少函数所花费的周期数。然后你覆盖循环,这样你就可以进一步减少管道依赖。有了这个程序和每条汇编指令所花费的所有周期的列表,我可以比编译器更好地优化。在不同的平台上,它有我可以注册的事件(缓存未命中、循环等),我可以运行该函数并跟踪CPU事件。那也不错。现在我正在使用带有Corei7Intel处理器的VisualS

c++ - 如何提示 Visual C++ 编译器优化器不太可能执行 if 语句的特定分支?

我们有一个用于错误检查的宏,如下所示:#defineCheckCondition(x)\if(x){\//okay,donothing\}else{\CallFunctionThatThrowsException();\}通常条件必须为true,我们希望CPU分支预测始终选择这条路径,如果它恰好是false,我们不这样做'真的不在乎预测错误-抛出异常和大量堆栈展开无论如何都会花费一大笔钱。根据CPU核心描述,分支预测将处理前向跳转和后向跳转略有不同(例如总是执行后向跳转而从不执行前向跳转),编译器可以通过生成正确的代码来改进分支预测提示CPU分支预测器。gcc好像有likelyandu

c++ - 如何提示 Visual C++ 编译器优化器不太可能执行 if 语句的特定分支?

我们有一个用于错误检查的宏,如下所示:#defineCheckCondition(x)\if(x){\//okay,donothing\}else{\CallFunctionThatThrowsException();\}通常条件必须为true,我们希望CPU分支预测始终选择这条路径,如果它恰好是false,我们不这样做'真的不在乎预测错误-抛出异常和大量堆栈展开无论如何都会花费一大笔钱。根据CPU核心描述,分支预测将处理前向跳转和后向跳转略有不同(例如总是执行后向跳转而从不执行前向跳转),编译器可以通过生成正确的代码来改进分支预测提示CPU分支预测器。gcc好像有likelyandu

c - 我怎样才能优化这个计算? (x^a + y^a +z^a)^(1/a)

如标题所示。我需要做很多这样的计算:re=(x^a+y^a+z^a)^(1/a).其中{x,y,z}>=0。更具体地说,a是正数浮点常数,x、y、z为float。^是一个求幂运算符。目前,我不想使用SIMD,但希望有其他技巧来加快速度。staticvoidheavy_load(void){staticstructxyz_t{floatx,y,z;};structxyz_txyzs[10000];floatre[10000]={.0f};constfloata=0.2;/*herefillxyzsusingsomerandompositivefloatingpointvalues*/fo

c - 我怎样才能优化这个计算? (x^a + y^a +z^a)^(1/a)

如标题所示。我需要做很多这样的计算:re=(x^a+y^a+z^a)^(1/a).其中{x,y,z}>=0。更具体地说,a是正数浮点常数,x、y、z为float。^是一个求幂运算符。目前,我不想使用SIMD,但希望有其他技巧来加快速度。staticvoidheavy_load(void){staticstructxyz_t{floatx,y,z;};structxyz_txyzs[10000];floatre[10000]={.0f};constfloata=0.2;/*herefillxyzsusingsomerandompositivefloatingpointvalues*/fo

c++ - 在 gcc 中禁用 "if(0)"消除

如何防止GCC消除if(0)block内的代码?当我使用VisualStudio时,我的调试技巧之一就是将这样的代码放入我的程序中:if(0)do_some_debug_printing_and_checking();然后,当一个断点被命中时,我点击do_some_debug_printing_and_checking()行,选择“设置下一条语句”并强制它执行。当我使用gcc/gdb作为后端时,“设置下一条语句”不再起作用,因为GCC只是从if(0)语句中删除了代码。p>我当然使用-O0标志来禁用优化。我还尝试了-fno-dce-fno-tree-dce标志来明确禁用死代码消除,但它没

c++ - 在 gcc 中禁用 "if(0)"消除

如何防止GCC消除if(0)block内的代码?当我使用VisualStudio时,我的调试技巧之一就是将这样的代码放入我的程序中:if(0)do_some_debug_printing_and_checking();然后,当一个断点被命中时,我点击do_some_debug_printing_and_checking()行,选择“设置下一条语句”并强制它执行。当我使用gcc/gdb作为后端时,“设置下一条语句”不再起作用,因为GCC只是从if(0)语句中删除了代码。p>我当然使用-O0标志来禁用优化。我还尝试了-fno-dce-fno-tree-dce标志来明确禁用死代码消除,但它没