我正在修改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
更加令人惊讶的是负载起作用。你有没有检查你是否实际加载了正确的值(对于那个值)? –