小编Cri*_*les的帖子

饱和减数 - AVX或SSE4.2

我正在改进程序(C)的性能,我无法获得更好的执行时间来改善最"昂贵"的循环.

如果元素大于零,我必须从unsigned long int数组的每个元素中减去1.

循环是:

unsigned long int * WorkerDataTime;
...
for (WorkerID=0;WorkerID<WorkersON;++WorkerID){
    if(WorkerDataTime[WorkerID] > 0) WorkerDataTime[WorkerID]-=1;
}
Run Code Online (Sandbox Code Playgroud)

我试试这个:

for (WorkerID=0;WorkerID<WorkersON;++WorkerID){
    int rest = WorkerDataTime[WorkerID] > 0;
    WorkerDataTime[WorkerID] = WorkerDataTime[WorkerID] - rest;
}
Run Code Online (Sandbox Code Playgroud)

但执行时间类似.

问题:是否有任何内向指令(SSE4.2,AVX ......)直接执行此操作?(我正在使用gcc 4.8.2)

我知道有可能使用char或short元素.(_mm_subs_epi8和_mm_subs_epi16)我不能使用AVX2.

谢谢.

c optimization gcc sse avx

7
推荐指数
2
解决办法
656
查看次数

标签 统计

avx ×1

c ×1

gcc ×1

optimization ×1

sse ×1