1

我的程序大部分时间都将数组向右移动以让位于新数据插入。所以,我正在寻找优化这个特定代码的方法。memmove()我决定创建自己的函数,而不是使用.OpenMP 来加快执行速度。

这是我的 C 代码子例程:

#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#define INT_LENGTH      8 // =sizeof(8) <- long int size 
#define INT_PER_CELL    3 // int number per CELL

void insertCell(char *c_mem, int *i_mem_len, int *i_mem_ins, char *c_cell){
    // c_mem      : array of CELL on the heap.
    // i_mem_len  : length of c_mem in CELL count
    // i_mem_ins  : targeted Nth CELL of c_mem to be inserted.
    // c_cell     : content cell to be inserted into c_mem

    long int *li_mem = (long int *) c_mem;

    #pragma omp parallel for
    for(int a=0; a<INT_PER_CELL; a++){
        int b = (*i_mem_ins * INT_PER_CELL) + a;
        int temp = (*i_mem_len * INT_PER_CELL) + a;
        while(temp > b){
            temp -= INT_PER_CELL;
            li_mem[temp + INT_PER_CELL] = li_mem[temp];
        }
    }

    memcpy(&c_mem[*i_mem_ins * INT_LENGTH * INT_PER_CELL], c_cell, INT_LENGTH * INT_PER_CELL);
    *i_mem_len += 1;
}


int main(void){
    ...
}

希望下面的插图有助于理解。

在此处输入图像描述

从上面的代码中,我使用它是long int因为它是可以在一个 CPU 步骤中移动的最大块数据(我假设)。但我正在寻找更大的数据长度。

我的问题是:INTEL 处理器是否专门支持 128 位物理长度来移动数据?如果有,如何利用它?

我知道 GCC 支持 128 位 int 长度进行数学运算,但据我了解,它需要两次 CPU 周期,因此它实际上是重复两次的本机 64 位数据。

4

0 回答 0