小编Pau*_*zak的帖子

使用SIMD(AVX2)进行稀疏阵列压缩

我有一个稀疏数组a(大多数为零):

unsigned char a[1000000]; 
Run Code Online (Sandbox Code Playgroud)

我想ba使用AVX2的Intel x64架构上使用SIMD指令的非零元素创建一个索引数组.我正在寻找有效如何做到的提示.具体来说,是否有SIMD指令来获取SIMD寄存器中连续非零元素的位置,是否连续排列?

c++ optimization simd sparse-array avx2

6
推荐指数
2
解决办法
1407
查看次数

在调试器中观察向量元素的简单方法

我正在使用Visual Studio 2013,并且在其悠久的历史中,它始终无法在调试器中显示向量元素,抱怨no operator "[]" matches these operands消息.我知道有一种解决方法需要打字v.operator[](n),但这对我来说是不可接受的.我想将光标悬停在上方v[n]并查看其值或最多选择或剪切并粘贴v[n]以查看值.是否可以使用其他Windows C++ IDE?

我知道向量的所有元素都显示在AutosLocals窗口中,但是我的向量太长了以至于不实用.

c++ debugging stdvector visual-studio visual-c++

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

你能用ctime重现或解释这个Visual C++错误吗?

无论在发布模式下使用Visual Studio Professional 2013 Update 3编译时,无论使用32位还是64位选项,此代码示例都将输出:time: 0N

#include <iostream>
#include <functional>
#include <ctime>

using namespace std;

void bar(int i, int& x, int& y)  {x = i%13; y = i%23;}

int g(int N = 1E9) {   
  int x, y;
  int r = 0;

  for (int i = 1; i <= N; ++i) {
    bar(i, x, y);
    r += x+y;
  }

  return r;
}

int main()
{
    auto t0 = clock();
    auto r  = g();
    auto t1 = …
Run Code Online (Sandbox Code Playgroud)

c++ std visual-studio-2013

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

使用 gcc 和 clang 在“std::basic_ostream&lt;char&gt;”中没有名为“str”的成员,但 msvc 没有问题

此代码片段(https://gcc.godbolt.org/z/hKDMxm):

#include <iostream>
#include <sstream>

using namespace std;

int main() {
    auto s = (ostringstream{} << "string").str();
    cout << s;
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

使用 msvc 编译并按预期运行,但无法使用 clang 9.0.0 和 gcc 9.2 进行编译,并给出以下错误消息:no member named 'str' in 'std::basic_ostream<char>'。查看https://en.cppreference.com/w/cpp/io/basic_ostringstream/str显然str()ostringstream. 为什么 clang 和 gcc 无法编译此代码?

c++ gcc std clang

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

使用范围库初始化 std::vector

我想std::vector使用一系列连续整数进行初始化,而不键入所有整数,例如在此代码片段中无法编译的第二行:

  std::vector<int> a{0, 1, 2, 3, 4, 5};
  std::vector<int> b{std::ranges::iota_view(0, 5)};  // ERROR!
Run Code Online (Sandbox Code Playgroud)

当然,我更喜欢:

  std::vector<int> b{0:5};
Run Code Online (Sandbox Code Playgroud)

但这不是在 C++41 标准之前安排的。任何想法如何在 C++20 中做到这一点?

c++ c++20

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

寻找连续整数列表初始化的快捷方式

我有一堆较长的手动初始化数组,例如:

const std::array<int, 16> a{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
const std::array<int, 16> b{16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31};
...
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以进行更简洁的初始化,例如沿着这些线(非法):

const std::array<int, 16> a{std::views::iota(0, 16)};
const std::array<int, 16> b{std::views::iota(16, 32)};
...
Run Code Online (Sandbox Code Playgroud)

c++ initializer-list iota

6
推荐指数
3
解决办法
205
查看次数

为什么这个列表理解比等效的生成器表达更快?

我在Windows上使用Python 3.3.1 64位和此代码片段:

len ([None for n in range (1, 1000000) if n%3 == 1])
Run Code Online (Sandbox Code Playgroud)

与此相比,执行时间为136毫秒:

sum (1 for n in range (1, 1000000) if n%3 == 1)
Run Code Online (Sandbox Code Playgroud)

在146ms执行.在这种情况下,生成器表达式不应该比列表理解更快或更快吗?

我引用了Guido van Rossum 从列表理解到生成器表达式:

... Python 3中的列表推导和生成器表达式实际上比它们在Python 2中更快!(并且两者之间不再存在速度差异.)

编辑:

我测量了时间timeit.我知道它不是很准确,但我只关心这里的相对速度,当我用不同的迭代次数测试时,我的列表理解版本的时间总是缩短.

python list-comprehension generator-expression python-3.x

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

使用 OpenCL 或其他 GPGPU 框架在现代 x86 硬件上的 CPU 和 GPU 之间共享数据

CPU 和 GPU 硬件的逐步统一,正如 AMD Kaveri 与 hUMA(异构统一内存访问)和英特尔第 4 代 CPU 所证明的那样,应该允许 CPU 和 GPU 之间的无复制数据共享。我想知道,最新的 OpenCL(或其他 GPGPU 框架)实现是否允许在 CPU 和 GPU 上运行的代码之间实现大型数据结构的真正无复制共享(无显式或隐式数据复制)。

gpgpu opencl

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

如何在构造具有不同类型元素的矢量副本时显式转换?

我正在制作q矢量的副本v,但元素类型不同并且可以隐式转换:

vector<int>   v = {1, 2, 3, 2};
vector<float> q(v.begin(), v.end());
Run Code Online (Sandbox Code Playgroud)

此代码使用关于类型转换的模板barf(警告)进行编译.什么是明确转换并避免警告的方法?

编辑

我正在使用警告级别为3(/ W3)的Visual Studio 2013.这是警告信息的顶部:

warning C4244: 'initializing' : conversion from 'int' to 'float', possible loss of data ...

c++ stl visual-c++

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

是否有 C++ std::vector Reserve()、push_back() 和 Shrink_to_fit() 的 Numpy 等效项?

我想将元素添加到空 Numpy 数组中。我事先知道最大数组大小。我找不到直接的方法来实现这一点,所以这是我的解决方法:

N = 1000
a = np.empty([N], dtype=np.int32)
j = 0

for i in range(N):
  if f(i):
    a[j] = g(i)
    j += 1

a.resize(j)
Run Code Online (Sandbox Code Playgroud)

是否有更优雅的编码方式,无需跟踪 中的当前长度j,类似于下面的 C++ 版本的简单性?

const int N = 1000;

vector<int> a;
a.reserve(N);

for (int i=0; i<N; i++) 
  if (f(i)) 
    a.push_back(g(i));

a.shrink_to_fit();
Run Code Online (Sandbox Code Playgroud)

是的,我读过如何在 Numpy 中就地扩展数组?,但它不涵盖这种特定情况,即事先已知的数组大小限制。

c++ python numpy

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