我正在處理一些代碼,我試圖儘可能地優化它,基本上它在一定的時間限制內運行。在C++中實現SIMD
下使電話...
static affinity_partitioner ap;
parallel_for(blocked_range<size_t>(0, T), LoopBody(score), ap);
...和下面是指在執行什麼。
void operator()(const blocked_range<size_t> &r) const {
int temp;
int i;
int j;
size_t k;
size_t begin = r.begin();
size_t end = r.end();
for(k = begin; k != end; ++k) { // for each trainee
temp = 0;
for(i = 0; i < N; ++i) { // for each sample
int trr = trRating[k][i];
int ei = E[i];
for(j = 0; j < ei; ++j) { // for each expert
temp += delta(i, trr, exRating[j][i]);
}
}
myscore[k] = temp;
}
}
我正在使用英特爾的TBB來優化這個。但我也一直在閱讀有關SIMD和SSE2以及這些性質的內容。所以我的問題是,如何將變量(i,j,k)存儲在寄存器中,以便可以通過CPU更快地訪問它們?我認爲答案與實施SSE2或其一些變體有關,但我不知道如何做到這一點。有任何想法嗎?
編輯:這將在Linux機器上運行,但使用英特爾編譯器我相信。如果有幫助,我必須在執行任何操作之前運行以下命令以確保編譯器正常工作... source /opt/intel/Compiler/11.1/064/bin/intel64/iccvars_intel64.csh; source /opt/intel/tbb/2.2/bin/intel64/tbbvars.csh ...然後編譯我做:icc -ltbb test.cxx -o test
如果沒有簡單的方法來實現SSE2,任何關於如何進一步優化代碼的建議?
感謝, 斯托伊奇
編譯器應該爲你做這種事情。 – zdav 2010-04-29 16:57:10
@zdav:C++的語義排除了向量化,因爲默認情況下,指針可能是未對齊的或別名的。 – Potatoswatter 2010-04-29 16:58:59
ICC允許您在代碼中提供嵌入的提示,以幫助它更好地進行矢量化。當然,如果你無法控制提供的數據等等,那麼這不會有太大的幫助。 – 2010-04-29 18:20:12