Intel 處理器上的SIMD 前綴和
簡介
對累積累積演算法和給定數組的。該操作在各種運算問題中都會遇到,並且需要高效能處理。在本文中,我們將討論 Intel CPU 上的 SIMD 指令是否可以增強前綴和演算法的效能。
使用 SIMD 的平行前綴和
一種平行前綴和演算法涉及分兩次執行操作。在第一遍中,並行計算部分和,然後累加每個部分和的總和。第二遍將每個部分和的總和加到下一個部分和中。透過 OpenMP 使用多執行緒實現並行性,並在第二遍使用 SIMD 指令可以提高效率。
SIMD 前綴和的代碼
以下是 SIMD前綴和的程式碼範例多於演算法:
__m128 scan_SSE(__m128 x) { x = _mm_add_ps(x, _mm_castsi128_ps(_mm_slli_si128(_mm_castps_si128(x), 4))); x = _mm_add_ps(x, _mm_shuffle_ps(_mm_setzero_ps(), x, 0x40)); return x; } void pass1_SSE(float *a, float *s, const int n) { __m128 offset = _mm_setzero_ps(); #pragma omp for schedule(static) nowait for (int i = 0; i < n / 4; i++) { __m128 x = _mm_load_ps(&a[4 * i]); __m128 out = scan_SSE(x); out = _mm_add_ps(out, offset); _mm_store_ps(&s[4 * i], out); offset = _mm_shuffle_ps(out, out, _MM_SHUFFLE(3, 3, 3, 3)); } float tmp[4]; _mm_store_ps(tmp, offset); return tmp[3]; } void pass2_SSE(float *s, __m128 offset, const int n) { #pragma omp for schedule(static) for (int i = 0; i<n/4; i++) { __m128 tmp1 = _mm_load_ps(&s[4 * i]); tmp1 = _mm_add_ps(tmp1, offset); _mm_store_ps(&s[4 * i], tmp1); } }
討論
這些最佳化可以顯著提高大型陣列上的前綴和運算的效能。對兩個通道使用 SIMD 進一步提高了效率,減少了計算時間。提供的程式碼在第二遍中使用 SIMD,並在四核心系統上實現了大約 7 倍的效能提升。
以上是Intel CPU 上的 SIMD 指令能否顯著提高前綴和演算法效能?的詳細內容。更多資訊請關注PHP中文網其他相關文章!