Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用内部函数时程序崩溃_C++_Visual Studio_Visual Studio 2013_Sse_Intrinsics - Fatal编程技术网

C++ 使用内部函数时程序崩溃

C++ 使用内部函数时程序崩溃,c++,visual-studio,visual-studio-2013,sse,intrinsics,C++,Visual Studio,Visual Studio 2013,Sse,Intrinsics,我不熟悉使用内在函数,所以我不知道为什么我的程序会崩溃。我能够构建程序,但当我运行它时,我只会看到“programname.exe已停止工作”窗口 问题是您的“源”(数组x)未与SSE指令所需的大小对齐 您可以使用“未对齐”加载指令解决此问题,也可以使用,例如: 现在,您的x和y数组已对齐到16个字节,并且可以从SSE指令访问[当然,索引是4的倍数]。请注意,对于采用内存参数的常规SSE指令,不允许进行未对齐访问,因此,例如,\u mm\u max\u ps要求第二个参数(英特尔顺序,AT&T顺

我不熟悉使用内在函数,所以我不知道为什么我的程序会崩溃。我能够构建程序,但当我运行它时,我只会看到“programname.exe已停止工作”窗口

问题是您的“源”(数组
x
)未与SSE指令所需的大小对齐

您可以使用“未对齐”加载指令解决此问题,也可以使用,例如:


现在,您的
x
y
数组已对齐到16个字节,并且可以从SSE指令访问[当然,索引是4的倍数]。请注意,对于采用内存参数的常规SSE指令,不允许进行未对齐访问,因此,例如,
\u mm\u max\u ps
要求第二个参数(英特尔顺序,AT&T顺序中的第一个)是对齐的内存位置

这可能不太可能,但您执行代码的机器是否可能不支持内部代码?请注意,并非所有处理器都支持所有的内部函数:将
\u mm\u load\u ps(ptrx)
更改为
\u mm\u loadu\u ps(ptrx)
或以64位模式编译,您的程序将不再崩溃。谢谢,@Zboson,一切正常。这两者之间的区别是什么?如果我没有弄错的话,
loadu
变量加载未对齐的变量并使它们对齐。所有SSE材料都需要这种校准。在x64上,默认情况下所有变量都是对齐的,这就是它在那里工作的原因。@JonB.Jones<代码>\u mm\u load\u ps要求内存16字节对齐<代码>\u mm\u loadu\u ps没有此类限制。在64位模式下,堆栈是16字节对齐的。但是,堆中的内存不一定是16字节对齐的。在较旧的CPU上,即使在对齐的内存上,
\u mm\u loadu\u ps
也比
\u mm\u loadu\u ps
慢得多,但情况并非如此。只需使用
\u mm\u loadu\u ps
继续。谢谢,这很有帮助,但我真的不明白对齐或不对齐意味着什么…@JonB.Jones,对齐意味着内存地址是16的倍数。你可以做这个测试。执行
printf(“%p%d\n”,ptrx,ptrx%16)
您将看到地址不是16字节的倍数(在32位模式下)。如果您在64位模式下编译或使用
\uu declspec(align(16))
它将是16字节的倍数,即对齐到16字节。哦,哇,好的。这为我澄清了很多。我忘记了英特尔处理器中的内存地址长度不一定是固定的,就像在MIPS处理器中一样。老兄,现在我后悔没早点来,哈哈。非常感谢你们的帮助,伙计们。动态分配的内存呢?
#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>
#include <intrin.h>

int _tmain(int argc, _TCHAR* argv[])
{
    const int N = 128;
    float x[N], y[N];
    float sum = 0;

    for (int i = 0; i < N; i++)
    {
        x[i] = rand() >> 1;
        y[i] = rand() >> 1;
    }

    float* ptrx = x;
    float* ptry = y;

    __m128 x1;

    x1 = _mm_load_ps(ptrx);

    return 0;
}
1>------ Rebuild All started: Project: intrins2, Configuration: Debug Win32 ------
1>  stdafx.cpp
1>  intrins2.cpp
1>c:\...\visual studio 2013\projects\intrins2\intrins2\intrins2.cpp(20): warning C4244: '=' : conversion from 'int' to 'float', possible loss of data
1>c:\...\visual studio 2013\projects\intrins2\intrins2\intrins2.cpp(21): warning C4244: '=' : conversion from 'int' to 'float', possible loss of data
1>  intrins2.vcxproj -> c:\...\visual studio 2013\Projects\intrins2\Debug\intrins2.exe
========== Rebuild All: 1 succeeded, 0 failed, 0 skipped ==========
    float __declspec(align(16)) x[N];
    float __declspec(align(16)) y[N];