我在元组中有一些值,我希望在元素方面添加另一个元组.所以我想要这样的功能:
std::tuple<int,int> a = {1,2};
std::tuple<int,int> b = {2,4};
std::tuple<int,int> c = a + b; // possible syntax 1
a += b; // possible syntax 2
a += {2,4}; // possible syntax 3
Run Code Online (Sandbox Code Playgroud)
输出元组将具有该值的位置 {3,6}
在以下问题是相关的,但答案是旧的,并且从用户评论马克Glisse表明有因为C ++ 17的新方法这个问题可能没有得到充分讨论。
我试图让对齐的内存为 SIMD 正常工作,同时仍然可以访问所有数据。
在 Intel 上,如果我创建一个类型为 的浮点向量__m256,并将我的大小减小 8 倍,它会给我对齐的内存。
例如 std::vector<__m256> mvec_a((N*M)/8);
以一种稍微有点麻烦的方式,我可以将指向向量元素的指针转换为浮点,这允许我访问单个浮点值。
相反,我更喜欢std::vector<float>正确对齐的 ,因此可以加载到__m256其他 SIMD 类型中而不会出现段错误。
我一直在研究aligned_alloc。
这可以给我一个正确对齐的 C 样式数组:
auto align_sz = static_cast<std::size_t> (32);
float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float));
Run Code Online (Sandbox Code Playgroud)
但是我不确定如何为std::vector<float>. 授予的std::vector<float>所有权marr_a 似乎是不可能的。
我已经看到一些建议我应该编写自定义分配器,但这似乎需要做很多工作,也许现代 C++ 有更好的方法?
当 NEON 向量指令在 ARM 设备上可用时,我一直在寻找复制各种数据量的快速方法。
\n我做了一些基准测试,并得到了一些有趣的结果。我试图理解我所看到的东西。
\n我有四个版本来复制数据:
\n逐个元素复制:
\nfor (int i = 0; i < size; ++i)\n{\n copy[i] = orig[i];\n}\nRun Code Online (Sandbox Code Playgroud)\n此代码将四个值加载到临时寄存器中,然后将该寄存器复制到输出。
\n因此,负载数量减少了一半。可能有一种方法可以跳过临时寄存器并将负载减少四分之一,但我还没有找到方法。
\nint32x4_t tmp;\nfor (int i = 0; i < size; i += 4)\n{\n tmp = vld1q_s32(orig + i); // load 4 elements to tmp SIMD register\n vst1q_s32(©2[i], tmp); // copy 4 elements from tmp SIMD register\n}\nRun Code Online (Sandbox Code Playgroud)\nmemcpy,使用memcpy,但一次复制 4 …