【问题标题】:Replacement of "typedef int64_t x_t __attribute__((vector_size(16)));替换“typedef int64_t x_t __attribute__((vector_size(16)));
【发布时间】:2015-04-03 15:46:36
【问题描述】:

我在尝试在 VS2013 Community C++ 下编译的一些代码中遇到了上述 typedef。

我找到了对 __declspec(align(16)) 和 allignas(16) 的引用,但无论我如何尝试将它们与 typedef 结合使用,代码的某些部分都会抱怨;使用这种类型定义:

typedef __declspec(align(16)) int64_t   x_t;

函数声明出现以下错误:

bool funcSame(x_t e1, x_t e2)
{
return e1[eStart] == e2[eStart] && e1[eEnd] == e2[eEnd];
}

上面的错误完全是 '[' with: no operator "[]" 匹配这些操作数

对于变量声明:

x_t a = { 0, 0 }; // at the 2nd '0' error too many initializer values

代码依赖于将 x_t 视为利用 SSE 操作的两个 64 位值的向量。

有人能解释一下我如何替换这个 typedef 来获取代码来编译和使用 SSE 操作吗?

谢谢你, 格雷厄姆....

【问题讨论】:

  • eval_tx_t 有什么关系?
  • @Kerrek:感谢您发现这一点,我已编辑。我试图删除上下文以帮助专注于问题。
  • 由于x_t 是一个简单类型(如long),除非eEndeStart 都是指针,e1[eEnd](等)表示法必然是错误的。
  • @Jonathan:eStart 和 eEnd 分别是值 0 和 1 的枚举的一部分。 gcc 编译器似乎使用 typedef 来定义一个包含 2 个连续 64 位值的类型,然后允许在该类型内进行索引(按 0 和 1)。
  • 也许“向量大小”的意思是,但typedef __declspec(align(16)) int64_t x_t; 没有声明数组类型,我有信心这是导致编译错误的原因。仅适度自信;我没有使用矢量大小表示法,所以我没有研究它的作用。

标签: c++ visual-c++


【解决方案1】:

如果我正确阅读了the documentation for the vector_size attribute,对齐只是结果的一部分(尽管链接页面上甚至没有提到它,但提到了 SIMD,并且 SSE 需要,而且更喜欢对齐的操作数)。

很遗憾,我认为不存在直接的 1:1 替代方案。 VC++ 内在函数包括__m128 类型,它是一个 16 字节对齐的类型,与您的“向量”具有相同的大小。

请参阅 this question 了解如何比较两个 __m128 变量。

【讨论】:

  • @rubenb:是的,来自与该主题相关的其他线程(通常与 struct union 类型相关联),似乎 1:1 不可用。现在我已经在整个代码中注释掉了这种类型的使用,以进行干净的编译。我认为答案可能是使用 __m128 和相关内在函数专门针对 MSVC 重写这些部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多