我在我的代码中有几个嵌套循环,我尝试在intel i7内核上使用intel SSE指令来加速应用程序。 该代码结构如下(val都在较高设置环路):嵌套for循环内的SSE指令
_m128 in1,in2,tmp1,tmp2,out;
float arr[4] __attribute__ ((aligned(16)));
val = ...;
... several higher for loops ...
for(f=0; f<=fend; f=f+4){
index2 = ...;
for(i=0; i<iend; i++){
for(j=0; j<jend; j++){
inputval = ...;
index = ...;
if(f<fend-4){
arr[0] = array[index];
arr[1] = array[index+val];
arr[2] = array[index+2*val];
arr[3] = array[index+3*val];
in1 = _mm_load_ps(arr);
in2 = _mm_set_ps1(inputval);
tmp1 = _mm_mul_ps(in1, in2);
tmp2 = _mm_loadu_ps(&array2[index2]);
out = _mm_add_ps(tmp1,tmp2);
_mm_storeu_ps(&array2[index2], out);
} else {
//if no 4 values available for SSE instruction execution execute serial code
for(int u = 0; u < fend-f; u++) array2[index2+u] += array[index+u*val] * inputval;
}
}
}
}
我认为有两个主要问题:用于从“阵列”对准值的缓冲液,而事实上,当没有4个值被留下(例如当fend = 6时,剩下的两个值应该用顺序码执行)。是否有任何其他方式加载in1的值和/或执行SSE intructions的3或2值?
感谢您的回答。加载和我想的一样好,但是在else语句中可以使用SSE指令解决的'剩余'部分是否有任何解决方法?
+1,因为你清楚地打败了我使用'_mm_set_ps'而不是对齐的缓冲区的解决方案。 – Mysticial
谢谢 - 这些日子之前,我很难回答SIMD的问题 - 你有没有睡过? ;-) –
我是一名学生,所以我的睡眠时间表由我的课程安排决定,与中西部地区的天气一样波动...... :) – Mysticial