爲可變數量的組合/可變指數循環快速生成嵌套for循環
#include <iostream>
#include <array>
template<size_t ... Rest>
inline void index_generator() {
constexpr int size = sizeof...(Rest);
std::array<int,size> maxes = {Rest...};
std::array<int,size> a;
int i,j;
std::fill(a.begin(),a.end(),0);
while(1)
{
for(i = 0; i<size; i++) {
std::cout << a[i] << " ";
}
std::cout << "\n";
for(j = size-1 ; j>=0 ; j--)
{
if(++a[j]<maxes[j])
break;
else
a[j]=0;
}
if(j<0)
break;
}
}
int main()
{
index_generator<2,3,3>();
return 0;
}
,其輸出如下
0 0 0
0 0 1
0 0 2
0 1 0
0 1 1
0 1 2
0 2 0
0 2 1
0 2 2
1 0 0
1 0 1
1 0 2
1 1 0
1 1 1
1 1 2
1 2 0
1 2 1
1 2 2
這確實相當於有
for (int i=0; i<2; ++i)
for (int j=0; j<3; ++j)
for (int k=0; i<3; ++k)
我可以生成等效使用上述方法的任何數量的nested for loops
的nt,但是我已經注意到,隨着循環次數的增加,這個代碼與其等同的對應物(即,嵌套for循環)。我用gcc 5.3
和clang 3.8
檢查了兩者。也許這是由於處理器很難預測while(true)
中的分支或者其他的東西。
我在最裏面的循環中所做的一般是訪問兩個數組中的數據並對它們進行乘法運算,如c_ptr[idx] +=a_ptr[idx]*b_ptr[idx]
。由於使用嵌套for循環和使用上述技術生成的索引是相同的,所以內存訪問模式保持不變。所以我很確定,就數據訪問而言,這不是緩存未命中/命中問題。
所以我的問題是:
- 有沒有辦法以最快的速度嵌套for循環的代碼風格或潛在的甚至更快產生這些組合/指數?
- 由於我們知道要建立的for循環的數量以及for循環的索引在編譯時是已知的,因此不能利用更好的優化機會?比如SIMD?
多少嵌套的循環,你呢? – Jarod42
嵌套循環的數量沒有限制。 –