GCC向量扩展:使用m64时AVX2内置洗牌崩溃

GCC向量扩展:使用m64时AVX2内置洗牌崩溃,c,gcc,mingw,vectorization,intrinsics,C,Gcc,Mingw,Vectorization,Intrinsics,我在Mingw gcc 4.9.2中有以下程序: #include <stdio.h> #include <stdint.h> #define VECSIZE 32 typedef char byteVec __attribute__ ((vector_size (VECSIZE))); #define PERMLEFT_BVEC (byteVec){63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,2

我在Mingw gcc 4.9.2中有以下程序:

#include <stdio.h>
#include <stdint.h>

#define VECSIZE 32

typedef char byteVec __attribute__ ((vector_size (VECSIZE))); 

#define PERMLEFT_BVEC (byteVec){63,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30}

byteVec permute(byteVec x, byteVec y) {
    return __builtin_shuffle(x,y,PERMLEFT_BVEC);
}
void print_vec32b(byteVec a) {
    printf("[ ");
    int i; for (i = 0; i < 32; ++i) printf("%d ", a[i]);
    puts("]");
}
int main() {
    byteVec x = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32};
    byteVec y = {11,12,13,14,15,16,17,18,19,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,88,89,90,91,92};
    byteVec z = permute(x,y);
    print_vec32b(x);
    return 0;
}
实际结果:崩溃。

崩溃描述:立即崩溃,windows错误报告错误出现。没有错误或警告

是时候学习调试了!寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建。如前所述,包含最小程序。如前所述,结果是崩溃。如前所述,预期结果是x和y的置换,其在32位模式下工作良好。我想我可以更清楚地知道输出本身是什么。我将编辑这个问题。我不明白如何调试它,这就是我来这里学习的原因。谢谢。“崩溃”不是正确的错误描述。这很像“不起作用”。使用调试器并向我们提供更多详细信息。并且不要发布到二进制文件的链接。你不知道他们会对不知情的人做什么(记住有太多人点击每个链接)。你的向量变量在堆栈上没有充分对齐:
vmovdqa-YMMWORD-PTR[rbp-48],ymm0
-
rbp
对齐到32字节,但48不能被32整除。
$ gcc nvec.c -m32 -mavx2 -o a.exe && a.exe
[ 92 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ]