今天在编译custom_op时发现一个gcc的bug,我用的是Ubuntu 21.04系统,编译时报/usr/include/c++/10/chrono:428:27: internal compiler error: 段错误的错误,查了一通后解决问题。
nvcc默认使用的gcc 10.3.0,只需要在nvcc后面添加--compiler-bindir /usr/bin/gcc-x就可以了。
今天在编译custom_op时发现一个gcc的bug,我用的是Ubuntu 21.04系统,编译时报/usr/include/c++/10/chrono:428:27: internal compiler error: 段错误的错误,查了一通后解决问题。
nvcc默认使用的gcc 10.3.0,只需要在nvcc后面添加--compiler-bindir /usr/bin/gcc-x就可以了。
最近在研究基于NPU的推理方法,编写的demo已经测试通过,但集成到项目中却发现各种问题。
1 | /home/killf/data/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: warning: libz.so, needed by /home/sensing/face-api-deps/HIAI/HiAI_DDK_100.300.010.010/HiAI_DDK_100.200.010.011/DDK/ai_ddk_mixmodel_lib/lib64/libhiai.so, not found (try using -rpath or -rpath-link) |
期初以为这个错误是因为在不到libz.so和libstdc++.so引起的,事实上只需要加上-rpath-link即可解决问题。
1 | target_link_options(test_performance PRIVATE -Wl,-rpath-link=/home/killf/data/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/26/) |
一切都编译没问题,但启动的时候直接报Segmentation fault,连main函数中第一行代码都没有执行,所以这肯定是链接的问题,通过逐一排除的方法,发现问题出现在libhiai.so上面。
1 | [libprotobuf ERROR /home/sensing/github/protobuf-3.6.1/src/google/protobuf/descriptor_database.cc:58] File already exists in database: google/protobuf/descriptor.proto[libprotobuf FATAL /home/sensing/github/protobuf-3.6.1/src/google/protobuf/descriptor.cc:1358] CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size): terminating with uncaught exception of type google::protobuf::FatalException: CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size): |
这是因为libhiai.so中存在静态链接的protobuf,而我们的项目也是静态链接了protobuf,造成二次链接的问题。
写在前面:
这个文章核心并不是程序优化的具体技巧,而是拿到一个问题如何思考和利用工具的通用方法。比如即使我们不知道 profiler 这个东西,通过搜索”代码 每一行 时间”也可以很快知道有这样的工具叫做 profiler,并且学会怎么使用。即使不知道 rand 这个函数怎么加速,通过搜索引擎也可以找到别人写好的现成代码。另一方面是发现瓶颈之后也不要着急自己修复,如果不是特别一目了然的话,先看看别人是怎么做的。站在巨人的肩膀上,事半功倍。
我们很多的问题和技术细节,其实,只要我们认真将官方文档过一遍,会发觉大部分的问题和认识模糊的地方都消失了。甚至,你还能发现自己之前通过搜索获得的到一些资料,可能是不准确或者已经过时的。官方文档是真正的好东西,因为编写文档的人群,通常就是这些技术或者软件的开发者,他们才是对这些东西最了解的人,因此,他们写的文档质量是很高的,通常也是最新的。
官方文档的不足的地方,大概是中文版本不多,看起来可能会比较吃力。不过,请相信我,下载一个翻译辅助软件,慢慢看还是可以的。另一方面,就是这些文档编写者,通常是技术界大牛,他们编写文档有时候是基于他们自己的技术认知水平,跳过了很多基础概念,也增加了阅读难度。不过,这个我们也可以通过多查资料,慢慢看来解决,并且通常会带来额外的学习收获。
看源代码 1)意味着你可以看到以及学习优秀的代码;2)意味着即使源代码有坑,你也会提前在大脑有回路更容易找到问题所在。
看不懂源码意味着不同的几点:
1)你对这个库或者代码的功能不熟悉 (知道某段源码的功能及特点)
2)你不会用 Debug
3)你的算法基础薄弱
4)源码太过混乱
你需要反思自己属于哪一项。针对其中某一类下药上来直接从头看源码学东西一般是不可行的。你需要从上层入侵到下层。先用这段代码才能看懂源码。而不是在上层都不熟悉的基础上开始。任何重复的代码/重复的类似代码。意味着你框架设计有问题,或者开发语言的表达能力不够。
Java 的固定设计模式就是 Java 本身表达能力不够的表现。流程意味着生命周期,即你不仅需要抽象已知的流程。还需要在未提及的点留下一个坑 (函数/接口/钩子)。往往这些坑在以后的需求变更和项目扩展和维护中是救命的点。日志非常重要,日志环境也非常重要,debug 是基础技能,对应的是开发状态。日志则对应稳定的线上状态。而不能重现的 bug 占整个开发的非常多的时间。所以错误日志记录详细的环境意味着你可以更快的重现这个错误。
more >>行内公式
L_2=\sqrt{x\div2} => $L_2=\sqrt{x\div2}$\% => $\%$\infty => $\infty$cgit是一个github快速下载器,使用国内镜像,clone速度可达10M/s。
项目地址:https://github.com/killf/cgit.git
目前,已提供了Ubuntu和Mac的预编译程序,如果使用的是其他系统,可以采用源码编译安装。
linux下安装1
sudo wget http://cgit.killf.info/cgit_linux_latest -O /usr/local/bin/cgit && sudo chmod 755 /usr/local/bin/cgit
mac下安装1
sudo wget http://cgit.killf.info/cgit_mac_latest -O /usr/local/bin/cgit && sudo chmod 755 /usr/local/bin/cgit
编译安装1
git clone https://github.com/killf/cgit.git && sudo ./cgit/install.sh
cgit运行时与需要使用git,因此需要先安装git,如果需要使用其他路径的git,可配置环境变量GIT,如:
1 | export GIT=/usr/bin/git |
cgit的使用方法git与一样,事实上内部使用的也是git,使用时只需将命令替换成cgit即可,如下:
1 | cgit clone https://github.com/killf/cgit.git |


前几天刚把放到Github上的开源程序发布到开源中国,没想到很快就有网站联系说希望收录这款软件,于是重新整理了下帮助文档,文档比较简单,以后有空再完善。
SqlContext是一个轻量级的Sql帮助类,旨在提供一种快速、简洁、优雅地数据库访问方法。
相比于重量级的EntityFramework,SqlContext非常轻量化,包括空行和注释,代码也不过几百行;而相对于ADO.Net,SqlContext又非常简洁、灵活和优雅,你可以以一种直观的方式来访问数据库,而不必关心其实现的细节。本质上,SqlContext是对ADO.Net的封装,ADO.Net能做的事情SqlContext都能做到。
SqlContext的基本功能:
项目地址:https://github.com/killf/SqlContext
more >>最近,项目中需要使用本地SQLite库,由于EF框架太重,而直接采用ADO.Net又太麻烦,所以就简单的封装了个Sql库,支持CURD、事务、(简单的)ORM、多数据库支持等,项目地址:https://github.com/killf/SqlContext
使用时需要先引用SQLite支持库,使用方法如下:
more >>一直想做一个面向Web的自动化测试工具,而最近工作中刚好遇到类似的问题,于是就先写了个支持库,用于自动化模拟点击,以备后用。
自动化模拟点有什么用?
因为使用的是sudo安装docker,所以会导致一个问题。以普通用户登录的状况下,在使用docker images时必须添加sudo,那么如何让docker免sudo依然可用呢?解决方案如下。
1 | sudo groupadd docker |
1 | sudo gpasswd -a ${USER} docker |
1 | sudo service docker restart |
1 | newgrp - docker |
注意:最后一步是必须的,否则因为 groups 命令获取到的是缓存的组信息,刚添加的组信息未能生效,所以 docker images 执行时同样有错。
添加如下配置即可:
1 | { |
默认的字体样式实在是太丑了,看起来非常密集,可以安装Font Switcher插件切换字体试一试,再不行可以直接安装一个字体,并在配置文件中配置进去。
使用Settings Sync插件即可,需要有一个github账号。
安装插件vscode-translator
vscode的界面默认是英文的,ctrl + shift + p然后输入configure language,选择或安装中文语言即可。
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent:
meta: false
pages: false
posts:
title: true
date: true
path: true
text: false
raw: false
content: false
slug: false
updated: false
comments: false
link: false
permalink: false
excerpt: false
categories: false
tags: true