【发布时间】:2016-09-22 19:10:18
【问题描述】:
我想将两个(浮点数/双精度)向量与 AVX 运算符相乘。为了做到这一点,我需要对齐内存。我的浮点值函数是:
#define SIZE 65536
float *g, *h, *j;
g = (float*)aligned_alloc(32, sizeof(float)*SIZE);
h = (float*)aligned_alloc(32, sizeof(float)*SIZE);
j = (float*)aligned_alloc(32, sizeof(float)*SIZE);
//Filling g and h with data
for(int i = 0; i < SIZE/8; i++)
{
__m256 a_a, b_a, c_a;
a_a = _mm256_load_ps(g+8*i);
b_a = _mm256_load_ps(h+8*i);
c_a = _mm256_mul_ps(a_a, b_a);
_mm256_store_ps (j+i*8, c_a);
}
free(g);
free(h);
free(j);
这行得通,但是当我尝试使用双精度值时,我得到一个内存访问错误(例如,如果内存没有正确对齐):
double *g_d, *h_d, *i_d;
g_d = (double*)aligned_alloc(32, sizeof(double)*SIZE);
h_d = (double*)aligned_alloc(32, sizeof(double)*SIZE);
i_d = (double*)aligned_alloc(32, sizeof(double)*SIZE);
for(int i = 0; i < SIZE/4; i++)
{
__m256d a_a, b_a, c_a;
a_a = _mm256_load_pd(g_d+4*i);
b_a = _mm256_load_pd(h_d+4*i);
c_a = _mm256_mul_pd(a_a, b_a);
_mm256_store_pd (i_d+i*4, c_a);
}
free(g_d);
free(h_d);
free(i_d);
为什么对齐对double-values 不起作用?
在 gdb 中运行它时,我得到了
Program received signal SIGSEGV, Segmentation fault.
0x0000000000401669 in _mm256_load_pd (__P=0x619f70) at /usr/lib/gcc/x86_64-linux-gnu/5/include/avxintrin.h:836
编辑:我发现了我的错误,这是前一个函数的复制/粘贴错误,它体现在该函数中。由于对其他人没有帮助(我认为),我关闭了这个问题。
【问题讨论】:
-
这些标识符名称很烂。 a、b、d是什么鬼?始终从文本编辑器复制/粘贴代码。从有这个问题的测试程序中,永远不要编造任何东西。
-
修正了变量,但稍后会添加一个简短的测试程序。
-
为我工作 (tm)。你用过调试器吗?它究竟在哪一行发生故障以及它读取(或写入?)的地址的值是什么。什么是确切的失败代码。
-
@MikeVine:我添加了调试器输出。
标签: c++ memory-alignment avx