小编Bim*_*Bim的帖子

使用后缀数组算法进行Burrows Wheeler变换

我成功地为我正在编写的压缩测试平台实现了一个BWT阶段(使用常规字符串排序).我可以应用BWT然后反BWT变换,输出匹配输入.现在我想加速使用后缀数组创建BW索引表.我找到了2个相对简单的,假设快速的O(n)算法用于后缀数组创建,DC3SA-IS都带有C++/C源代码.我尝试使用这些源代码(开箱即用的编译SA-IS源代码也可以在这里找到),但无法获得正确的后缀数组/ BWT索引表.这就是我所做的:

  1. T =输入数据,SA =输出后缀数组,n = T的大小,K =字母大小,BWT = BWT索引表

  2. 我处理8位字节,但两种算法都需要一个零字节形式的唯一标记/ EOF标记(DC3需要3,SA-IS需要一个),因此我将所有输入数据转换为32位整数,增加所有符号均为1,并附加标记零字节.这是T.

  3. 我创建了一个整数输出数组SA(DC3的大小为n,KA-IS的大小为n +)并应用算法.我得到的结果类似于我的排序BWT变换,但有些值是奇数(见更新1).两种算法的结果也略有不同.SA-IS算法在前面产生一个超额索引值,因此所有结果都需要被一个索引(SA [i] = SA [i + 1])左侧复制.

  4. 要将后缀数组转换为正确的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)

c++ algorithm suffix-array burrows-wheeler-transform

7
推荐指数
1
解决办法
1152
查看次数

CMake:为 add_custom_target 添加可执行文件

我有一个 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),但这不起作用。

编辑:澄清 - …

c++ cmake visual-studio-code

5
推荐指数
0
解决办法
1127
查看次数

在安全启动的情况下执行rdmsr / wrmsr?

我正在尝试在安全启动模式下运行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”,但这没有帮助。我使用的工具iuvoltUNDERVOLT,而且直接尝试WRMSR。
如何在安全启动模式下执行rdmsr / wrmsr?

这里这里是一些信息和一个旧修补程序,使其可以与安全启动一起使用。但是现在代码完全不同了。

linux code-signing kernel-module msr

5
推荐指数
0
解决办法
214
查看次数

使用QOpenGLWidget进行屏幕外渲染的最简单方法

我有一个隐藏的QOpenGLWidget(Qt 5.4.2,不是QGLWidget),我想基本上不断地使用grab()或grabFramebuffer()来获取其内容(并将其写入磁盘).窗口小部件在可见时呈现正常,但在隐藏时不呈现.如果我执行show()后跟hide()调用它可以工作.这看起来很奇怪,因为QOpenGLWidget在内部已根据文档渲染到帧缓冲区.实现这一目标的最简单方法是什么(如果可能的话,不创建另一个帧缓冲区)?
能够使用QOpenGLWidget作为其视口捕获屏幕外QGraphicsView的加分点,其中包含自定义OpenGL绘制的QGraphicsItems ...

opengl qt framebuffer off-screen

2
推荐指数
2
解决办法
1万
查看次数