当尝试让循环自动向量化时,我见过这样的代码:
void addFP(int N, float *in1, float *in2, float * restrict out)
{
for (i = 0 ; i < N; i++)
{
out[i] = in1[i] + in2[i];
}
}在需要restrict关键字的地方,可以向编译器保证指针别名,这样它就可以向量化循环。
像这样的东西会做同样的事情吗?
void addFP(int N, float *in1, float *in2, std::unique_ptr<float> out)
{
for (i = 0 ; i < N; i++)
{
out[i] = in1[i] + in2[i];
}
}如果这确实有效,那么哪个是更便携的选择呢?
在你试图自动向量化的循环中,std::unique_ptr可以用来代替restrict关键字吗?
发布于 2016-09-04 21:51:00
restrict is not part of C++11,相反,它是C99的一部分。
std::unique_ptr<T> foo;告诉你的编译器:我只需要这个作用域中的内存。一旦此作用域结束,请释放内存。
restrict告诉你的编译器:我知道你不能知道也不能证明这一点,但我发誓这是对这个函数中出现的这块内存的唯一引用。
unique_ptr不会停止别名,编译器也不应该假定别名不存在:
int* pointer = new int[3];
int* alias = pointer;
std::unique_ptr<int> alias2(pointer);
std::unique_ptr<int> alias3(pointer); //compiles, but crashes when deleting因此,您的第一个版本在C++11中是无效的(尽管它可以在许多现代编译器上运行),并且第二个版本不能完成您所期望的优化。才能得到行为保护者std::valarray。
发布于 2015-03-17 19:46:45
我不这样认为。假设代码如下:
auto p = std::make_unique<float>(0.1f);
auto raw = p.get();
addFP(1, raw, raw, std::move(p));https://stackoverflow.com/questions/29098187
复制相似问题