c++ - _mm512_i64gather_pd() 的内存访问错误
问题描述
我正在尝试使用一个非常简单的 AVX-512 收集指令示例:
double __attribute__((aligned(64))) array3[17] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0,
9.0, 10.0, 11.0, 12.0, 13.0, 14.0, 15.0, 16.0,
17.0};
int __attribute__((aligned(64))) i_index_ar[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16};
__m512i i_index = _mm512_load_epi64(i_index_ar);
__m512d a7AVX = _mm512_i64gather_pd(i_index, &array3[0], 1);
不幸的是,我最后一次调用_mm512_i64gather_pd
导致内存访问错误(内存转储)。
德语错误信息:Speicherzugriffsfehler (Speicherabzug geschrieben)
我正在使用英特尔至强融核 (KNL) 7210。
编辑:这里的错误是,我使用 32 位整数和 64 位加载指令,并且缩放必须_mm512_i64gather_pd
是 8 或sizeof(double)
.
解决方案
我认为您需要设置scale
为sizeof(double)
,而不是 1。
改变:
__m512d a7AVX = _mm512_i64gather_pd(i_index, &array3[0], 1);
到:
__m512d a7AVX = _mm512_i64gather_pd(i_index, &array3[0], sizeof(double));
另请参阅:this question and its answers 以更全面地解释英特尔 SIMD 收集的负载及其用法。
——</p>
另一个问题:您的索引需要是 64 位整数,所以更改:
int __attribute__((aligned(64))) i_index_ar[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, ...
到:
int64_t __attribute__((aligned(64))) i_index_ar[16] = {1, 2, 3, 4, 5, 6, 7, 8, 9, ...
推荐阅读
- jquery - jQuery 无法使用父函数获取正确的 div
- javascript - 翻译模块中未定义上下文
- python - 按顺序迭代 NetworkX DiGraph 的节点
- api - 无内容和错误 204(无内容)错误的 Shopware 产品 API 响应
- algorithm - 如何优化 Haskell 代码以通过 HackerRanks 超时测试用例(不是为了任何正在进行的比赛,只是我在练习)
- tensorflow - 在 TensorflowExtended (TFX) 中处理可变长度特征
- object - 当用户单击“按钮 4”时,控制台会记录什么内容,为什么?
- ios - 使用通用链接在我的会议应用程序中打开 jitsi 视频,但它只打开我的 App.not 会议
- amazon-web-services - EKS 节点组真的有必要吗
- xcode - 如何从 Xcode 打开现有的颤振项目?