我想知道如何将这个C代码转换成C ++用于内存对齐。

float *pResult = (float*) _aligned_malloc(length * sizeof(float), 16);

我确实看了这里然后我尝试了这个float *pResult = (float*) __attribute__((aligned(16)));

还有这个

float *pResult = __attribute__((aligned(16)));

但两者都有类似的错误。

error: expected primary-expression before '__attribute__'|
error: expected ',' or ';' before '__attribute__'|

完整的代码

#include "stdafx.h"
#include <xmmintrin.h>  // Need this for SSE compiler intrinsics
#include <math.h>       // Needed for sqrt in CPU-only version
#include "stdio.h"

int main(int argc, char* argv[])
{
    printf("Starting calculation...\n");

    const int length = 64000;

    // We will be calculating Y = Sin(x) / x, for x = 1->64000

    // If you do not properly align your data for SSE instructions, you may take a huge performance hit.
    float *pResult = (float*) __attribute__((aligned(16))); // align to 16-byte for SSE
    __m128 x;
    __m128 xDelta = _mm_set1_ps(4.0f);      // Set the xDelta to (4,4,4,4)
    __m128 *pResultSSE = (__m128*) pResult;


    const int SSELength = length / 4;

    for (int stress = 0; stress < 100000; stress++) // lots of stress loops so we can easily use a stopwatch
    {
#define TIME_SSE    // Define this if you want to run with SSE
#ifdef TIME_SSE
        x = _mm_set_ps(4.0f, 3.0f, 2.0f, 1.0f); // Set the initial values of x to (4,3,2,1)
        for (int i=0; i < SSELength; i++)
        {
            __m128 xSqrt = _mm_sqrt_ps(x);
            // Note! Division is slow. It's actually faster to take the reciprocal of a number and multiply
            // Also note that Division is more accurate than taking the reciprocal and multiplying

#define USE_DIVISION_METHOD
#ifdef USE_FAST_METHOD
            __m128 xRecip = _mm_rcp_ps(x);
            pResultSSE[i] = _mm_mul_ps(xRecip, xSqrt);
#endif //USE_FAST_METHOD
#ifdef USE_DIVISION_METHOD
            pResultSSE[i] = _mm_div_ps(xSqrt, x);
#endif  // USE_DIVISION_METHOD

            // NOTE! Sometimes, the order in which things are done in SSE may seem reversed.
            // When the command above executes, the four floating elements are actually flipped around
            // We have already compensated for that flipping by setting the initial x vector to (4,3,2,1) instead of (1,2,3,4)

            x = _mm_add_ps(x, xDelta);  // Advance x to the next set of numbers
        }
#endif  // TIME_SSE
#ifndef TIME_SSE
        float xFloat = 1.0f;
        for (int i=0 ; i < length; i++)
        {
            pResult[i] = sqrt(xFloat) / xFloat; // Even though division is slow, there are no intrinsic functions like there are in SSE
            xFloat += 1.0f;
        }
#endif  // !TIME_SSE
    }

    // To prove that the program actually worked
    for (int i=0; i < 20; i++)
    {
        printf("Result[%d] = %f\n", i, pResult[i]);
    }

    // Results for my particular system
    // 23.75 seconds for SSE with reciprocal/multiplication method
    // 38.5 seconds for SSE with division method
    // 301.5 seconds for CPU

    return 0;
}

===============>>#1 票数:2 已采纳

使用C ++ 11,您可以使用以下内容:

struct aligned_float
{
    alignas(16) float f[4];
};

static_assert(sizeof(aligned_float) == 4 * sizeof(float), "padding issue");

int main()
{
    const int length = 64000;
    std::vector<aligned_float> pResult(length / sizeof(aligned_float));

    return 0;
}

===============>>#2 票数:1

对齐的属性仅适用于编译/链接的方式。 它没有运行时效果。

我知道解决这个问题的唯一可移植方法是使用一个实际分配超过必要值的包装器,然后屏蔽低位以确保它可以满足足够的对齐。

===============>>#3 票数:1

看这里:

http://www.gnu.org/software/libc/manual/html_node/Aligned-Memory-Blocks.html

Glibc提供了aligned_alloc()。

  ask by pandoragami translate from so

未解决问题?本站智能推荐:

1回复

使用_aligned_malloc()的unique_ptr <>的C ++数据对齐

我试图确保在将对象添加到vector数据结构之前将其对齐。 响应warning C4316: 'Basic' : object allocated on the heap may not be aligned 16警告,我对Basic对象有以下要求: 这是一个标准对象。 接下来,为n
1回复

C ++ SSE和int的对齐数组和int的向量

多亏了你们中的某些人,我已经使用SSE加快了我在C ++中的科学应用程序功能之一的计算速度,并使用SSE指令来比较ints的巨大向量 。 优化的SSE功能的最终版本是: 哪里 和 尺寸巨大(18M x 64) 我的天真的问题是:如果同时满足以下两个条件,您是否
5回复

获得对齐内存的最佳跨平台方法

这是我通常用于通过Visual Studio和GCC获得对齐内存的代码 这个代码一般是好的吗? 我也看到人们使用_mm_malloc , _mm_free 。 在大多数情况下,我想要对齐内存,使用SSE / AVX。 我可以一般使用这些功能吗? 它会使我的代码更简单。 最后
2回复

读/写部分分配的对齐内存

关于访问未分配的内存有很多问题,这显然是未定义的行为。 但是接下来的情况呢? 请考虑以下结构,该结构对齐到16个字节,但仅占8个字节: 现在,我们通过SSE对齐的加载/存储内在函数访问16个字节的数据: 这也是未定义的行为,我应该改用填充吗? 无论如何,由于Inte
2回复

对齐,总大小和SSE

我正在尝试为PCL库定义自定义点类型 。 在该教程中,他们谈论的是内存对齐,因此我首先尝试了解内存的工作方式。 在此页面中 ,他们提供了一种相当简单的方法来计算结构的总体对齐方式。 例如,这种结构 大小为24: 对于g++ 4.8.1 , sizeof返回24。到目前为
1回复

尝试将std :: aligned_storage与SSE和new一起使用

我想尝试使用C ++中的SSE instrincs来获取一些浮点数的平方根。 但是当我尝试存储结果时,我得到一个例外。 我可以像这样使用std :: aligned_storage吗?
4回复

SSE和C ++容器

有以下代码段错误的明显原因吗? 谢谢 编辑:我在linux / i686上使用g ++ 4.5.0,我可能不知道我在做什么,但是因为甚至以下的段错误 我真的认为它必须和对齐问题。
3回复

内存对齐,结构和malloc

在一个问题中很难表达我想知道的内容,因此我将尝试对其进行分解。 出于示例目的,假设我们具有以下结构: 是否确实保证编译器不会重新排列X成员的顺序,仅在必要时添加填充? 换句话说,offsetof(X,a)<offsetof(X,c​​)是否总是正确的? 编译器会
1回复

告诉C ++指针数据是16字节对齐的

我用静态数组编写了一些代码,它的矢量化很好。 我想动态分配数组。 我尝试过这样的事情: 但是编译器(GCC 4.9.2)不再能够对代码进行矢量化。 我假设这是因为它不知道指针数据是16字节对齐的。 我得到的消息如下: 我尝试在使用数据之前添加此行,但它似乎没有做任何
1回复

__m128d不是本地对齐的吗?

我有以下代码: 但是“有时”它会引起Access内存冲突 ,我认为这是由于我的3个数组a , b和c缺少内存对齐导致的。 但是由于我在__m128d上__m128d (使用__declspec(align(16)) ),所以当我__m128d为那些指针时,不保证对齐吗? 还是