我在我的代碼中有幾個嵌套循環,我嘗試在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