我正在尝试优化一些矩阵计算,我想知道是否有可能在编译时检测SSE/SSE2/AVX/AVX2/AVX-512/AVX-128-FMA/KCVI [1]是否由编译器?理想情况下,对于GCC和Clang,但我只能管理其中一个.
我不确定它是否可能,也许我将使用自己的宏,但我更愿意检测它并要求用户选择它.
[1] "KCVI"代表骑士角矢量指令优化.像FFTW这样的库检测/利用这些较新的指令优化.
我有几个Github项目,我想知道这些项目的指标.
是否有工具为给定的Github项目生成指标?甚至像LOC这样的非常基本的指标也足够了(即使更完整的指标也会受到重视).
我刚刚发现有一个很好的服务,Caliper,这样做,但已经关闭.还有其他此类服务吗?
在一个项目中,我在三个不同的可执行文件上运行测试用例,使用不同的选项进行编译.根据选项,可以使用或不使用某些代码路径.现在,我只使用一个可执行文件的覆盖数据.
我正在使用gcovr生成一个XML,然后由Sonar解析:
gcovr -x -b -r . --object-directory=debug/test > coverage_report.xml
Run Code Online (Sandbox Code Playgroud)
我有三套gcda和gcno文件,但我不知道如何生成它们的全局报告.
有没有办法做到这一点?
我正在研究编译器,我想提高它的性能.我发现大约50%的时间花在解析源文件上.由于源文件非常小,之后我做了很多转换,在我看来它是可以完善的.
我的解析器是一个带有词法分析器(带有lexer :: pos_iterator)的Boost Spirit解析器,我有一个中等大小的语法.我正在将源解析为AST.
我的问题是我不知道解析过程中花费的时间最多:AST节点,词法分析器,解析器规则或内存的副本.
我不认为这是I/O问题,因为我正在使用SSD并且我在开始时完全读取文件然后仅使用内存版本.
我尝试使用分析器,但是花费时间的方法是Boost的一些方法,其名称长达数百个字符,我不知道它们到底做了什么......
那么,是否有一种首选方法来对Boost Spirit Parser及其语法进行基准测试?或者是否有一些规则可用于验证某些特定点的效率?
谢谢
感兴趣的人的来源:
c++ benchmarking boost-spirit boost-spirit-qi boost-spirit-lex
我现在使用Boost测试很长时间了,最终我的测试运行得太慢了.由于每个测试都是高度并行的,我希望它们与我的所有内核同时运行.
有没有办法使用Boost测试库?我没有找到任何解决方案.我试着看一下如何编写自定义测试运行器,但我没有太多关于这一点的文档:(
如果没有办法,有人知道一个好的C++测试框架来实现这个目标吗?我当时认为Google Test会完成这项工作,但显然它也无法并行运行测试.即使框架具有比其他更知名的框架更少的功能,它也不是问题,我只需要简单的断言和多线程执行.
谢谢
我尝试使用Boost Spirit为一个小编程语言实现一个Lexer.
我必须得到一个令牌的值,我得到一个bad_get异常:
在抛出'boost :: bad_get'的实例后调用终止
what():boost :: bad_get:失败的值得到使用boost :: get Aborted
这样做时我得到了这个例外:
std::string contents = "void";
base_iterator_type first = contents.begin();
base_iterator_type last = contents.end();
SimpleLexer<lexer_type> lexer;
iter = lexer.begin(first, last);
end = lexer.end();
std::cout << "Value = " << boost::get<std::string>(iter->value()) << std::endl;
Run Code Online (Sandbox Code Playgroud)
我的词法分析器定义如下:
typedef std::string::iterator base_iterator_type;
typedef boost::spirit::lex::lexertl::token<base_iterator_type, boost::mpl::vector<unsigned int, std::string>> Tok;
typedef lex::lexertl::actor_lexer<Tok> lexer_type;
template<typename L>
class SimpleLexer : public lex::lexer<L> {
private:
public:
SimpleLexer() {
keyword_for = "for";
keyword_while = "while";
keyword_if = "if";
keyword_else = "else"; …Run Code Online (Sandbox Code Playgroud) 我在一个项目上尝试CLang 3.4和libc ++,我在发布模式下遇到奇怪的链接错误:
/home/wichtounet/dev/eddic/src/ast/Operator.cpp:17: error: undefined reference to
'std::__1::basic_ostream<char, std::__1::char_traits<char>>&
std::__1::operator<< <char, std::__1::char_traits<char>, std::__1::allocator<char>>(
std::__1::basic_ostream<char, std::__1::char_traits<char>>&,
std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>> const&
)'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)
一切都很好.程序在调试模式下正确链接,但在使用O2时则不会.在O0,O1和Os中,一切正常,但在O2,O3,Os中没有链接.我也试过LTO模式,它工作正常.
我尝试了两个版本的libc ++,但无济于事.
代码对我来说似乎并不坏:
std::ostream& ast::operator<< (std::ostream& stream, ast::Operator op){
std::string value = "asd";
return stream << value;
}
Run Code Online (Sandbox Code Playgroud)
但我没有一个简单的例子导致问题.
clang ++用于构建和链接代码.我使用"-std = c ++ 1y -stdlib = libc ++"进行编译,并加上一些库链接的东西.
有什么可能导致这种情况?
编辑:在发布模式下完全调用链接步骤:
clang++ -v -use-gold -Iinclude -std=c++1y -stdlib=libc++ -Wextra -Wall -Qunused-arguments -Wuninitialized -Wsometimes-uninitialized -Wno-long-long -Winit-self …Run Code Online (Sandbox Code Playgroud) 因为我需要测试Boost的一些实验性功能,所以我想从Modular Boost存储库安装Boost.
我按照https://svn.boost.org/trac/boost/wiki/TryModBoost上的说明操作,b2命令失败:
./b2 headers
/home/wichtounet/src/modular-boost/tools/build/src/build/feature.jam:493: in feature.validate-value-string from module feature
error: "none" is not a known value of feature <optimization>
error: legal values: "off" "speed" "space"
/home/wichtounet/src/modular-boost/tools/build/src/build/property.jam:273: in validate1 from module property
/home/wichtounet/src/modular-boost/tools/build/src/build/property.jam:299: in property.validate from module property
/home/wichtounet/src/modular-boost/tools/build/src/tools/builtin.jam:377: in variant from module builtin
/usr/share/boost-build/site-config.jam:9: in modules.load from module site-config
/home/wichtounet/src/modular-boost/tools/build/src/build-system.jam:249: in load-config from module build-system
/home/wichtounet/src/modular-boost/tools/build/src/build-system.jam:351: in load-configuration-files from module build-system
/home/wichtounet/src/modular-boost/tools/build/src/build-system.jam:524: in load from module build-system
/home/wichtounet/src/modular-boost/tools/build/src/kernel/modules.jam:289: in import from module modules
/home/wichtounet/src/modular-boost/tools/build/src/kernel/bootstrap.jam:139: in boost-build …Run Code Online (Sandbox Code Playgroud) 我遇到了lcov的性能问题.
我正在七个不同的配置文件中执行一个程序,收集每个配置文件的覆盖范围,然后将覆盖配置文件与lcov合并:
lcov --rc lcov_branch_coverage=1 -a coverage_1.dat -a coverage_2.dat -a coverage_3.dat -a coverage_4.dat -a coverage_5.dat -a coverage_6.dat -a coverage_7.dat -o coverage_full.dat
Run Code Online (Sandbox Code Playgroud)
然而,这非常缓慢.组合我的7个配置文件大约需要10分钟,这实际上比编译和运行7个配置文件要长.每个dat文件大约有1M行.
在lcov --combine和lcov --remove步骤非常缓慢的为好.每个人大约45秒.
有没有办法加快这个组合步骤?如果需要我可以使用几个线程,我有足够的内存.如果有其他工具能够正确地进行这种组合,我也会感兴趣(我已经尝试将文件转换为Cobertura并使用我发现的Python脚本进行合并,但它崩溃了).
如果完全有替代lcov,我也很感兴趣.我一直在使用gcovr,但有了它,我必须使用其他几种工具来进行组合并且它不是最佳的,但速度要快得多.
我想知道是否有任何解决方案可以找到一个类型是否是一个模板的特化,它采用非类型参数而不指定每个类型?
例如,如果有这样的类:
template<typename T, std::size_t R>
struct F {}
Run Code Online (Sandbox Code Playgroud)
现在,我正在使用一个非常专业的特征:
template<template<typename, std::size_t> class TT, typename T>
struct is_2 : std::false_type { };
template<template<typename, std::size_t> class TT, typename V1, std::size_t R>
struct is_2<TT, TT<V1, R>> : std::true_type { };
Run Code Online (Sandbox Code Playgroud)
并使用像is_2<F, T>::value.但是,这是不实际的,因为如果添加另一个模板参数,则必须编辑特征.此外,如果您有多个此类模板,则需要为每个模板编写特征.
有没有办法让事情变得更实用?我可以使用C++ 14.我并不是说使用宏来减少代码量.
c++ ×7
boost ×2
boost-spirit ×2
c++11 ×2
clang ×2
gcc ×2
gcov ×2
avx ×1
avx512 ×1
benchmarking ×1
boost-test ×1
c++14 ×1
clang++ ×1
concurrency ×1
g++ ×1
gcovr ×1
git ×1
github ×1
lcov ×1
libc++ ×1
metrics ×1
sse ×1
templates ×1
unit-testing ×1