【发布时间】:2017-05-02 10:14:47
【问题描述】:
这是我的问题的一个更简单的视图,我想将浮点值转换为定义的类型 v4si(我想使用 SIMD 操作进行优化。)请帮助将浮点/双精度值转换为定义的类型。
#include<stdio.h>
typedef double v4si __attribute__ ((vector_size (16)));
int main()
{
double stoptime=36000;
float x =0.5*stoptime;
float * temp = &x;
v4si a = ((v4si)x); // Error: Incompatible data types
v4si b;
v4si *c;
c = ((v4si*)&temp); // Copies address of temp,
b = *(c);
printf("%f\n" , b); // but printing (*c) crashes program
}
【问题讨论】:
-
C 还是 C++?哪一个?
-
有什么原因不能以正常方式使用内在函数吗?另外,我们在这里谈论的是什么 CPU/架构? x86?手臂 ?电源/PowerPC?
-
它的 C 编程(在标题中提到)。它的 x86 架构,实际上我是 SIMD 的新手,并试图通过使用 SIMD 向量乘法删除 for 循环来优化 c 代码。
-
好的 - 我已经更新了你的标签,并假设你想使用 SSE。如果您使用 StackOverflow 上的搜索工具,您会发现很多标记为
[sse]的问题 - 看看其中的一些问题,以熟悉使用 SIMD 内部函数的一些基础知识, -
作为初学者,您可以更轻松地使用英特尔的
_mm_loadu_ps内在函数来加载 4 个双精度,并使用_mm_mul_ps将它们相乘。与您使用的 GNU C 矢量扩展相比,英特尔的内在函数有更好的文档记录和更多的教程。主要的缺点是它们在 x86 之外不可移植,但您只针对 x86。请参阅 SSE 标签 wiki 以获取文档和教程的链接。