私のプログラムは、ほとんどの時間を配列を右にシフトして、新しいデータの挿入に道を譲ります。したがって、この特定のコードを最適化する方法を探しています。を使用するのではなく、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
、1 つの CPU ステップで移動できる最大のチャンク データであるため、使用しています (推測します)。しかし、私はより大きなデータ長を探しています。
私の質問は次のとおりです: INTEL プロセッサは、データを移動するために 128 ビットの物理長を特にサポートしていますか? もしあれば、それを悪用する方法は?
GCC が数学演算で 128 ビットの int の長さをサポートしていることは承知していますが、私の理解では、2 倍の CPU サイクルが必要になるため、実際にはネイティブの 64 ビット データが 2 回繰り返されます。