标签: valarray

用于SSE/AVX的对齐内存上的valarray

有没有办法确保valarray使用对齐的内存,以便可以使用SSE和AVX进行矢量化?据我所知,STL不保证对齐,你不能将分配器传递给valarray.还有另一种方法来实现这一目标吗?

谢谢!

c++ sse avx valarray

5
推荐指数
1
解决办法
1075
查看次数

std :: valarray和并行化

可能是这么愚蠢的问题.

这个网站上我读到了

valarray规范允许库通过多种效率优化来实现它,例如某些操作的并行化

目前std::valarray在不同平台和编译器上并行化的是什么?海湾合作委员会,VS2010/2013,铿锵?

特别是标准的线程支持C++11.

UPD:如果一些sompilers不支持此功能.执行此操作的最佳方法是:在多个线程中将一些函数应用于容器的元素?显然,天真的解决方案会很短并且运行良好std::thread但可能存在更好的解决方案?

c++ parallel-processing c++11 valarray

5
推荐指数
1
解决办法
872
查看次数

为什么valarray分配不会根据文档调整受让人的大小?

码:

#include <valarray>
#include <iostream>    

using namespace std;

int main()
{
  valarray<int> v0(2, 4);
  valarray<int> v1;
  v1 = v0;
  cout << "v0.size: " << v0.size() << endl;
  cout << "v1.size: " << v1.size() << endl;
  cout << "v0[0]: " << v0[0] << endl;
  cout << "v1[0]: " << v1[0] << endl;
}
Run Code Online (Sandbox Code Playgroud)

输出:

v0.size: 4
v1.size: 0
v0[0]: 2
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

对于作业:

v1 = v0;
Run Code Online (Sandbox Code Playgroud)

我会认为构造函数:

valarray<T>& operator=( const valarray<T>& other );
Run Code Online (Sandbox Code Playgroud)

应该使用并根据文档,我相信v1应该调整大小,v0的内容复制到它,元素的元素.那真正发生了什么?

$ g++ --version
g++ (GCC) …
Run Code Online (Sandbox Code Playgroud)

c++ assignment-operator valarray

5
推荐指数
1
解决办法
376
查看次数

在valarray上,STL算法"count"的返回类型是什么

我使用的是Visual Studio 2010 Pro一个上Windows 7 64bit机,我想使用count(从<algorithm>上头)valarray:

int main()
{

  valarray<bool> v(false,10);
  for (int i(0);i<10;i+=3)
         v[i]=true;

  cout << count(&v[0],&v[10],true) << endl;

  // how to define the return type of count properly?
  // some_type Num=count(&v[0],&v[10],true); 
}
Run Code Online (Sandbox Code Playgroud)

上面程序的输出是正确的:

4
Run Code Online (Sandbox Code Playgroud)

但是,我想将值赋给变量,并int在编译器警告中使用有关精度损失的结果.由于valarray没有迭代器,我无法弄清楚如何使用iterartor::difference_type.

这有点可能吗?

c++ iterator valarray

5
推荐指数
1
解决办法
185
查看次数

为什么捕获 lambda 不能应用于 std::valarray?

什么不符合将 lambda 传递给apply方法的条件std::valarray?考虑以下代码:

int main()
{
    std::valarray<int> arr = {1, 2, 3, 4, 5, 6};
    auto arr1 = arr.apply([](int val) { return val * 2; }); // compiles
    int n = 3;
    auto arr2 = arr.apply([n](int val) { return val * n; }); //does not compile
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

住在coliru http://coliru.stacked-crooked.com/a/f0407046699574fc

https://gcc.godbolt.org/ 上测试
GCC、MSVC 或 CLang 都不会编译上述代码

c++ lambda stl valarray

5
推荐指数
1
解决办法
310
查看次数

这是在gcc中实现std :: valarray的错误吗?

我尝试了以下程序

#include <iostream>
#include <valarray>

int main( void ) 
{
    std::valarray<int> v1 = { 1, 2, 3, 4, 5 };
    std::valarray<int> v2 = { 1, 2, 3, 4, 5 };

    auto v3 = v1 * v2;

    for ( const auto &item : v3 ) std::cout << item << ' ';
    std::cout << '\n';

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

并得到了一条错误消息,适当的函数begin用于v3本声明隐含使用

    for ( const auto &item : v3 ) std::cout << item << ' ';
Run Code Online (Sandbox Code Playgroud)

找不到。

所以我尝试了以下代码

#include <iostream>
#include …
Run Code Online (Sandbox Code Playgroud)

c++ gcc operator-overloading valarray c++20

4
推荐指数
1
解决办法
125
查看次数

使用valarrays发生奇怪的C++编译错误

我在C++中使用valarrays有一个奇怪的编译错误.

这是我的代码的精简版:

#include <iostream>
#include <valarray>

using namespace std;

bool test(const int &x,const valarray<int> &a,const valarray<int> &b) {
    return a*x==b;
}

int main() {
    int a1[3]= {1,2,3};
    int b1[3]= {2,4,6};
    valarray<int> a(a1,3);
    valarray<int> b(b1,3);
    int x=2;
    cout<<test(x,a,b);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

预期的行为:输出true或的一些变体1

编译错误(使用g ++):

main.cpp: In function ‘bool test(const int&, const std::valarray<int>&, const std::valarray<int>&)’:
main.cpp:7:14: error: cannot convert ‘std::_Expr<std::_BinClos<std::__equal_to, std::_Expr, std::_ValArray, std::_BinClos<std::__multiplies, std::_ValArray, std::_Constant, int, int>, int>, bool>’ to ‘bool’ in return
  return a*x==b;
              ^
Run Code Online (Sandbox Code Playgroud)

这个编译错误意味着什么,以及如何解决它?

c++ compiler-errors std syntax-error valarray

3
推荐指数
2
解决办法
556
查看次数

为什么 std::valarray 是非算术的?

我注意到std::is_arithmetic<std::valarray<float>>评估为false. 不是 valarrays 的全部意义在于促进将标量代码重载到“自动矢量化”而不诉诸 boost 等吗?

为什么它不继承其模板类型的算术属性?

我的问题不一定是问题,而是我的根本误解,因为如果确实有意,我一定会错过一些哲学见解。

c++ type-traits valarray

3
推荐指数
1
解决办法
47
查看次数

指向矢量的指针,但不是指向valarray?

我正在尝试提取一个const指针指向数组的部分方式.我发现它在使用矢量时工作正常,但在使用valarray时不会编译(VS 2008).有人可以解释一下问题是什么吗?

struct vector_test
{
    std::vector<int> v;

    const int *pointy(const int i) const
    {
        return &(v[i]); // Ok
    }
};

struct valarray_test
{
    std::valarray<int> v;

    const int *pointy(const int i) const
    {
        return &(v[i]); // error C2102: '&' requires l-value
    }
};
Run Code Online (Sandbox Code Playgroud)

c++ pointers valarray

2
推荐指数
1
解决办法
1709
查看次数

无需复制即可将valarray转换为矢量

我有一个非常大的valarray,我需要转换为一个向量,因为我正在使用的库只需要一个向量作为输入.我想知道是否可以在不复制的情况下从valarray转换为vector.这就是我所拥有的:

#include <vector>
#include <valarray>

int main() {
    std::valarray<double> va{ {1, 2, 3, 4, 5} };

    //Error: cannot convert from 'initializer list' to 'std::vector<eT,std::allocator<_Ty>>'
    //std::vector<double> v1{ std::begin(va), va.size() };

    //Error: cannot convert from 'std::valarray<double>' to 'std::vector<eT,std::allocator<_Ty>>'
    //std::vector<double> v2{ std::move(va) };

    // Works but I'm not sure if it's copying
    std::vector<double> v3;
    v3.assign(std::begin(va), std::end(va));
}
Run Code Online (Sandbox Code Playgroud)

有关assign的文档说明该函数"将新内容分配给向量,替换其当前内容,并相应地修改其大小.".这听起来像是复制品.有没有办法不复制?

c++ vector valarray

2
推荐指数
1
解决办法
1074
查看次数

对列表中任意元素的恒定时间访问(C++)

我正在研究一种算法的实现,我想表明它可以在恒定时间内工作,即使有很多元素也是如此.

不幸的是,我需要一个存储元素的数据结构.当元素的数量非常高,但对我的算法而言并非不合理时,std :: vector和std :: valarray都不会在常量时间访问任意元素,如此图所示.

是否有更好的数据结构来存储值?是否有任何技术可以实现以实现恒定时间访问?

c++ stdvector valarray constant-time

1
推荐指数
1
解决办法
349
查看次数