我正在修改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。
'from'的值是什麼?是否有'_mm256_load_ps'內在的實際實現爲2個128位加載的機會? –
從崩潰時的值是891. &(dest.ac [b * 8 + from + 0])= 0x957e6c 。所以在表格中間有一個訪問權限,但這不是對齊的。帶有該值的 – Arkantus
更加令人驚訝的是負載起作用。你有沒有檢查你是否實際加載了正確的值(對於那個值)? –