小编toz*_*zak的帖子

与在GCC中间接访问相比,为什么直接访问结构成员会产生更多的汇编代码?

在C中访问结构成员时,直接访问或间接访问(通过指针)是否更快是有很多主题的.

一个例子:C指针与结构的直接成员访问

一般意见是直接访问将更快(至少在理论上),因为不使用指针解引用.

所以我在我的系统中尝试了一大堆代码:GNU Embedded Tools GCC 4.7.4,为ARM生成代码(实际上是ARM-Cortex-A15).

令人惊讶的是,直接访问速度要慢得多.然后我生成了目标文件的汇编代码.

直接访问代码有114行汇编代码,间接访问代码有33行汇编代码.这里发生了什么?

下面是C代码和生成的函数汇编代码.结构都映射到外部存储器,结构成员都是单字节字长(unsigned char类型).

第一个功能,间接访问:

void sub_func_1(unsigned int num_of, struct file_s *__restrict__ first_file_ptr, struct file_s  *__restrict__ second_file_ptr, struct output_s *__restrict__ output_ptr)
{
    if(LIKELY(num_of == 0))
     {
        output_ptr->curr_id                         = UNUSED;
        output_ptr->curr_cnt                        = output_ptr->cnt;

        output_ptr->curr_mode                       = output_ptr->_mode;
        output_ptr->curr_type                       = output_ptr->type;
        output_ptr->curr_size                       = output_ptr->size;
        output_ptr->curr_allocation_type            = output_ptr->allocation_type;
        output_ptr->curr_allocation_localized       = output_ptr->allocation_localized;
        output_ptr->curr_mode_enable                = output_ptr->mode_enable;

        if(output_ptr->curr_cnt == 1)
         {
            first_file_ptr->status                  = BLOCK_IDLE;
            first_file_ptr->type                    = USER_DATA_TYPE;
            first_file_ptr->index                   = FIRST__WORD;
            first_file_ptr->layer_cnt               = output_ptr->layer_cnt;

            second_file_ptr->status                 = DISABLED;
            second_file_ptr->index                  = …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc pointers compiler-optimization

10
推荐指数
1
解决办法
394
查看次数

如何在“位置敏感哈希”中将向量哈希到存储桶中(使用jaccard距离)?

我正在实现一个近邻搜索应用程序,它将找到相似的文档。到目前为止,我已经阅读了很多有关LSH的资料(LSH背后的理论有些令人困惑,我还不能100%理解它)。

我的代码能够使用minhash函数计算签名矩阵(我已经接近尾声了)。我也将签名策略应用于签名矩阵。但是,我不明白如何将一个带中的(列的)签名向量散列到存储桶中。

我的最后一个问题可能是最重要的一个,但我不得不问一些introduction问题:

问题1:哈希函数是否只会将相同的向量映射到相同的存储桶?(假设我们有足够的水桶)

问题2:哈希函数是否应将相似的向量映射到同一存储桶?如果是,那么这种相似性的程度/定义是多少,因为我不是在计算比较,而是在进行哈希处理。

q3:根据上面的问题,我应该使用哪种哈希表算法?

q4:我认为我的最弱点是我不知道如何生成将向量作为输入并选择存储桶作为输出的哈希函数。我可以根据q1和q2自己实现一个...关于为LSH生成哈希函数的任何建议bucketing

c hash machine-learning minhash locality-sensitive-hash

6
推荐指数
1
解决办法
3086
查看次数

为什么在两个内核之间的邮箱数据通信中需要两个内存屏障?

这里我们有一段用于两个ARM内核之间数据通信的邮箱代码(直接引用自《ARM Cortex A系列编程指南》)。

核心A:

STR R0, [Msg] @ write some new data into postbox
STR R1, [Flag] @ new data is ready to read
Run Code Online (Sandbox Code Playgroud)

核心B:

Poll_loop:
LDR R1, [Flag]
CMP R1,#0 @ is the flag set yet?
BEQ Poll_loop
LDR R0, [Msg] @ read new data.
Run Code Online (Sandbox Code Playgroud)

为了强制执行依赖关系,文档指出我们需要在代码中插入两个而不是一个内存屏障 DMB。

核心A:

STR R0, [Msg] @ write some new data into postbox
DMB
STR R1, [Flag] @ new data is ready to read
Run Code Online (Sandbox Code Playgroud)

核心B:

Poll_loop:
LDR R1, [Flag]
CMP R1,#0 @ …
Run Code Online (Sandbox Code Playgroud)

c memory gcc arm

5
推荐指数
1
解决办法
238
查看次数