我正在改进程序(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.
谢谢.