我们正在将一个主要应用程序从Arm32移植到Arm64.我们的算法经常使用SSAT和USAT指令.它们非常有用,执行任何大小的左移或右移,然后有符号或无符号饱和到任意数量的位.这对于图像处理算法非常有用,因为我们可以执行一些生成32位整数结果的数学运算,然后从中获取所需的任何位(饱和到输出图像的位深度的最大值/最小值),一条指令.
这些指令在Arm64中莫名其妙地消失了,我们发现的最接近的替代方法是SQSHRN/ UQSHRN/ SQSHLN/ UQSHLN执行移位和饱和但在它们执行的饱和度方面受到更多限制(USAT可以饱和到任何宽度,甚至7位;新指令可以仅饱和到输入宽度的一半,例如在32位输入的情况下为16位,这将需要额外的处理以实现所需的结果).
有人可以解释为什么删除这些指令,以及有效移植使用它们的现有代码的最佳方法是什么?
Chrome网络浏览器包含一个强大的跟踪器工具,它不仅允许跟踪和调试网页,还允许您自己的程序创建特殊格式的JSON文件并将其显示为程序中事件的可视化时间线,这对于调试多进程/多线程系统中的性能瓶颈。我正在努力让这个工具对用户来说尽可能易于使用且无麻烦。
假设我在外部程序中创建了一个 JSON 文件,现在我希望在跟踪器中查看它。步骤是:
chrome://tracing在地址栏中输入。我的问题是:这个过程可以从命令行自动化吗?我查了一下,什么也没发现。也许这里需要一些 JavaScript 魔法。
背景阅读:
如果您想要跟踪器的示例输入文件,请复制以下文本并将其命名为mytimeline.json. 请按照上述步骤进行查看。
[ {"cat":"1", "pid":1000,"tid":1001,"ts":100000,"ph":"B","name":"UpdateLayoutTree","args":{"timestamp-s":"jun 2 12:12:12","frame":10034} }
, {"cat":"1", "pid":1000,"tid":1001,"ts":102000,"ph":"B","name":"subfunc","args":{"timestamp-e":"jun 2 12:12:13", "elementCount":4} }
, {"cat":"1", "pid":1000,"tid":1001,"ts":108000,"ph":"E","args":{"timestamp-e":"jun 2 12:12:13"} }
, {"cat":"1", "pid":1000,"tid":1001,"ts":110000,"ph":"E","args":{"timestamp-e":"jun 2 12:12:13"} }
, {"cat":"1", "pid":1000,"tid":1002,"ts":120000,"dur":15000,"ph":"X","name":"Something","args":{"elementCount":4} }
, {"cat":"2", "pid":1003,"tid":1004,"ts":125000,"ph":"i","name":"Boom","args":{"elementCount":4}, "s": "t" }
]
Run Code Online (Sandbox Code Playgroud) 我正在从事一个由几十个共享库组成的项目,每个共享库都有许多相关的单元测试。许多库还依赖于其他库,因为用于某些特定功能的库将使用较常见的库之一中的代码。最后,当然还有依赖于lib的生产可执行文件。
毫无疑问,某个核心公共库的API(头文件)的更改将触发几乎整个系统的重大重新编译。但是通常实现上只有一个变化,编译的唯一文件是修改后的.cxx,理论上只需要链接修改后的lib-由于有了动态链接,因此不需要重新链接其他任何东西。但是CMake还是继续执行它:在重新链接lib之后,它将重新链接与该lib相关的所有单元测试。然后,它重新链接该库的依赖关系树中的所有库及其所有单元测试。最后,它重新链接生产可执行文件。由于项目的规模,这需要很多宝贵的时间。
我已基于此最小示例通过一个简单的项目重现了此行为(为简洁起见,注释已更改为共享,删除了注释)。我的系统是Intel PC上的Ubuntu 16,而我的CMake版本是3.5.1。
从一个空目录开始并创建以下文件:
CMakeLists.txt
cmake_minimum_required (VERSION 2.8.11)
project (HELLO)
add_subdirectory (Hello)
add_subdirectory (Demo)
Run Code Online (Sandbox Code Playgroud)
演示/CMakeLists.txt
add_executable (helloDemo demo.cxx)
target_link_libraries (helloDemo LINK_PUBLIC Hello)
Run Code Online (Sandbox Code Playgroud)
演示/demo.cxx
#include "hello.h"
int main() { hello(); }
Run Code Online (Sandbox Code Playgroud)
你好/CMakeLists.txt
add_library (Hello SHARED hello.cxx)
target_include_directories (Hello PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
Run Code Online (Sandbox Code Playgroud)
你好/hello.h
void hello();
Run Code Online (Sandbox Code Playgroud)
你好/hello.cxx
#include <stdio.h>
void hello() { printf("hello!\n"); }
Run Code Online (Sandbox Code Playgroud)
现在运行以下命令:
mkdir build
cd build
cmake ../
make
Run Code Online (Sandbox Code Playgroud)
您现在可以执行Demo/helloDemo并查看hello!。
现在,再次输入touchHello / hello.cxx make。您将看到helloDemo可执行文件已重新链接(“ Linking CXX executable helloDemo …