2015-05-19 13 views
3

我正在修改RNNLM神經網絡來研究語言模型。然而,考慮到我的語料庫的大小,它運行得很慢。我試圖優化矩陣*向量例程(這是對於小數據集總時間的63%負責(我預計它會在更大的集合上更糟糕))。現在我被固有內容困住了。如果我改變AVX:數據對齊:商店崩潰,storeu,加載,loadu不

_mm256_storeu_ps (&(dest.ac[b*8+from+0]), t4); 

(帶u未對齊我想)一切都會按計劃

_mm256_store_ps (&(dest.ac[b*8+from+0]), t4); 

不過:在

for (b=0; b<(to-from)/8; b++) 
    { 
     val = _mm256_setzero_ps(); 
     for (a=from2; a<to2; a++) 
     { 
      t1 = _mm256_set1_ps (srcvec.ac[a]); 
      t2 = _mm256_load_ps(&(srcmatrix[a+(b*8+from+0)*matrix_width].weight)); 
      //val =_mm256_fmadd_ps (t1, t2, t3) 
      t3 = _mm256_mul_ps(t1,t2); 
      val = _mm256_add_ps (val, t3); 
     } 
     t4 = _mm256_load_ps(&(dest.ac[b*8+from+0])); 
     t4 = _mm256_add_ps(t4,val); 
     _mm256_store_ps (&(dest.ac[b*8+from+0]), t4); 
    } 

這個例子崩潰。我的問題是:爲什麼加載工作(而不應該,如果數據未對齊)和存儲不。 (此外兩者都在同一地址上運行)。

dest.ac一直在使用

void *_aligned_calloc(size_t nelem, size_t elsize, size_t alignment=64) 
{ 
    size_t max_size = (size_t)-1; 

    // Watch out for overflow 
    if(elsize == 0 || nelem >= max_size/elsize) 
     return NULL; 

    size_t size = nelem * elsize; 
    void *memory = _mm_malloc(size+64, alignment); 
    if(memory != NULL) 
     memset(memory, 0, size); 
    return memory; 
} 

分配和它的至少50個元素長。 (順便說一句VS2012我有一些隨機任務的非法指令,所以我用linux。)

先謝謝了, Arkantus。

+0

'from'的值是什麼?是否有'_mm256_load_ps'內在的實際實現爲2個128位加載的機會? –

+0

從崩潰時的值是891. &(dest.ac [b * 8 + from + 0])= 0x957e6c 。所以在表格中間有一個訪問權限,但這不是對齊的。帶有該值的 – Arkantus

+0

更加令人驚訝的是負載起作用。你有沒有檢查你是否實際加載了正確的值(對於那個值)? –

回答

0

TL:DR:在優化代碼中,loads will fold into memory operands for other operations, which don't have alignment requirements in AVX。商店不會。


示例代碼本身並不編譯,所以我不能輕易檢查_mm256_load_ps編譯什麼指令。

我用gcc 4.9試了一個小實驗,它根本沒有生成vmovaps,因爲我只用加載的結果作爲其他指令的輸入。它使用內存操作數生成該指令。 AVX指令對其存儲器操作數沒有對齊要求。 (穿過緩存線時性能下降,穿越頁面邊界時擊中更大,但代碼仍然有效)

另一方面,該存儲區確實會生成vmov...指令。由於您使用了對齊所需版本,因此它在未對齊的地址上發生故障。只需使用未對齊的版本;當地址對齊時它會一樣快,而當它不對齊時仍然工作。

我沒有仔細檢查你的代碼,看看所有的訪問是否應該對齊。我不認爲,從你說的話來說,只是問爲什麼你不會因未對齊的負載而出現故障。就像我說的,可能你的代碼只是沒有編譯成任何vmovaps加載指令,否則即使是「對齊」的AVX加載也不會在未對齊的地址上出錯。

你在Sandy/Ivybridge CPU上運行AVX(沒有AVX2或FMA?)嗎?我假設這就是爲什麼你的FMA內在評論被註釋掉了。

+0

是的,我在Sandy CPU上使用AVX。是的一些訪問不對齊!謝謝 !我會使用你的版本,我明白了爲什麼! – Arkantus