我有一个稀疏数组a(大多数为零):
unsigned char a[1000000];
Run Code Online (Sandbox Code Playgroud)
我想b在a使用AVX2的Intel x64架构上使用SIMD指令的非零元素创建一个索引数组.我正在寻找有效如何做到的提示.具体来说,是否有SIMD指令来获取SIMD寄存器中连续非零元素的位置,是否连续排列?
我正在使用Visual Studio 2013,并且在其悠久的历史中,它始终无法在调试器中显示向量元素,抱怨no operator "[]" matches these operands消息.我知道有一种解决方法需要打字v.operator[](n),但这对我来说是不可接受的.我想将光标悬停在上方v[n]并查看其值或最多选择或剪切并粘贴v[n]以查看值.是否可以使用其他Windows C++ IDE?
我知道向量的所有元素都显示在Autos和Locals窗口中,但是我的向量太长了以至于不实用.
无论在发布模式下使用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) 此代码片段(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 无法编译此代码?
我想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 中做到这一点?
我有一堆较长的手动初始化数组,例如:
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) 我在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.我知道它不是很准确,但我只关心这里的相对速度,当我用不同的迭代次数测试时,我的列表理解版本的时间总是缩短.
CPU 和 GPU 硬件的逐步统一,正如 AMD Kaveri 与 hUMA(异构统一内存访问)和英特尔第 4 代 CPU 所证明的那样,应该允许 CPU 和 GPU 之间的无复制数据共享。我想知道,最新的 OpenCL(或其他 GPGPU 框架)实现是否允许在 CPU 和 GPU 上运行的代码之间实现大型数据结构的真正无复制共享(无显式或隐式数据复制)。
我正在制作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 ...
我想将元素添加到空 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++ ×8
python ×2
std ×2
visual-c++ ×2
avx2 ×1
c++20 ×1
clang ×1
debugging ×1
gcc ×1
gpgpu ×1
iota ×1
numpy ×1
opencl ×1
optimization ×1
python-3.x ×1
simd ×1
sparse-array ×1
stdvector ×1
stl ×1