我成功地为我正在编写的压缩测试平台实现了一个BWT阶段(使用常规字符串排序).我可以应用BWT然后反BWT变换,输出匹配输入.现在我想加速使用后缀数组创建BW索引表.我找到了2个相对简单的,假设快速的O(n)算法用于后缀数组创建,DC3和SA-IS都带有C++/C源代码.我尝试使用这些源代码(开箱即用的编译SA-IS源代码也可以在这里找到),但无法获得正确的后缀数组/ BWT索引表.这就是我所做的:
T =输入数据,SA =输出后缀数组,n = T的大小,K =字母大小,BWT = BWT索引表
我处理8位字节,但两种算法都需要一个零字节形式的唯一标记/ EOF标记(DC3需要3,SA-IS需要一个),因此我将所有输入数据转换为32位整数,增加所有符号均为1,并附加标记零字节.这是T.
我创建了一个整数输出数组SA(DC3的大小为n,KA-IS的大小为n +)并应用算法.我得到的结果类似于我的排序BWT变换,但有些值是奇数(见更新1).两种算法的结果也略有不同.SA-IS算法在前面产生一个超额索引值,因此所有结果都需要被一个索引(SA [i] = SA [i + 1])左侧复制.
要将后缀数组转换为正确的BWT索引,我从后缀数组值中减去1,做一个模数并且应该有BWT索引(根据这个):BWT [i] =(SA [i] -1)%n .
这是我的代码,用于提供SA算法并转换为BWT.您应该能够或多或少地从论文中插入SA构造代码:
std::vector<int32_t> SuffixArray::generate(const std::vector<uint8_t> & data)
{
std::vector<int32_t> SA;
if (data.size() >= 2)
{
//copy data over. we need to append 3 zero bytes,
//as the algorithm expects T[n]=T[n+1]=T[n+2]=0
//also increase the symbol value by 1, because the algorithm alphabet is [1,K]
//(0 is …Run Code Online (Sandbox Code Playgroud) 我有一个 CMakeLists.txt 和一些工具链文件。在我的 CMakeLists.txt 中,我有一条生成 .elf 可执行文件的语句。然后通过一些命令(使用 add_custom_target,代码来自此处)运行该可执行文件,生成 .gba 文件,这是我要启动的真正可执行文件。现在的问题是,我正在使用 VS Code 的 cmake 扩展,并且目标没有显示启动(可能是因为它不被视为可执行文件)。我尝试了 add_executable(target.gba IMPORT),但这不起作用。在 CMakeLists.txt 中:
add_executable(target.elf ${SOURCE_FILES} ${INCLUDE_FILES} ${EXTRA_DATA_FILES}) # Create the elf file
add_gba_executable(target.elf) # Generate the .gba from the .elf
Run Code Online (Sandbox Code Playgroud)
在工具链文件中:
function(add_gba_executable target)
get_filename_component(target_name ${target} NAME_WE)
add_custom_target(${target_name}.gba ALL SOURCES
COMMAND ${OBJCOPY} -v -O binary ${target} ${target_name}.gba
COMMAND ${GBAFIX} ${target_name}.gba
DEPENDS ${target}
VERBATIM
)
set_target_properties(${target} PROPERTIES LINK_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-Map=${target_name}.map -specs=gba.specs")
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${target_name}.gba)
endfunction()
Run Code Online (Sandbox Code Playgroud)
我如何告诉 CMake add_custom_target 的结果也是可执行文件?我尝试了 add_executable(target.gba IMPORT),但这不起作用。
编辑:澄清 - …
我正在尝试在安全启动模式下运行Ubuntu 18.04 /内核4.18.0-16的Intel Skylake计算机上降低CPU的性能,并且需要读取/写入MSR 0x150。我已经签名并加载了msr.ko内核模块,但是甚至不能以root /超级用户身份从msr-tools运行可执行文件rdmsr和wrmsr(我得到权限错误)。我所掌握的是,使用较新的内核(> 3.7?)无法从用户空间访问MSR。描述了一些解决方法:我尝试同时为rdmsr和wrmsr设置“ setcap cap_sys_rawio + ep”,但这没有帮助。我使用的工具iuvolt和UNDERVOLT,而且直接尝试WRMSR。
如何在安全启动模式下执行rdmsr / wrmsr?
我有一个隐藏的QOpenGLWidget(Qt 5.4.2,不是QGLWidget),我想基本上不断地使用grab()或grabFramebuffer()来获取其内容(并将其写入磁盘).窗口小部件在可见时呈现正常,但在隐藏时不呈现.如果我执行show()后跟hide()调用它可以工作.这看起来很奇怪,因为QOpenGLWidget在内部已根据文档渲染到帧缓冲区.实现这一目标的最简单方法是什么(如果可能的话,不创建另一个帧缓冲区)?
能够使用QOpenGLWidget作为其视口捕获屏幕外QGraphicsView的加分点,其中包含自定义OpenGL绘制的QGraphicsItems ...
c++ ×2
algorithm ×1
cmake ×1
code-signing ×1
framebuffer ×1
linux ×1
msr ×1
off-screen ×1
opengl ×1
qt ×1
suffix-array ×1