小编Hym*_*mir的帖子

新AVX512指令的成本 - 分散存储

我正在玩新的AVX512指令集,我试着了解它们是如何工作的以及如何使用它们.

我尝试的是交错由掩码选择的特定数据.我的小基准测试将x*32字节的对齐数据从内存加载到两个向量寄存器中,并使用动态掩码压缩它们(图1).得到的向量寄存器被分散到存储器中,因此两个向量寄存器是交错的(图2).

压缩两个向量寄存器

图1:使用相同的动态创建掩码压缩两个数据向量寄存器.

分散存储到交错

图2:用于交错压缩数据的分散存储.

我的代码如下所示:

void zipThem( uint32_t const * const data, __mmask16 const maskCompress, __m512i const vindex, uint32_t * const result ) {
   /* Initialize a vector register containing zeroes to get the store mask */
   __m512i zeroVec     = _mm512_setzero_epi32();
   /* Load data */
   __m512i dataVec_1   = _mm512_conflict_epi32( data );
   __m512i dataVec_2   = _mm512_conflict_epi32( data + 16 );
   /* Compress the data */
   __m512i compVec_1   = _mm512_maskz_compress_epi32( maskCompress, dataVec_1 );
   __m512i compVec_2   = _mm512_maskz_compress_epi32( maskCompress, dataVec_2 );

   /* Get …
Run Code Online (Sandbox Code Playgroud)

performance x86 intrinsics avx512

10
推荐指数
0
解决办法
587
查看次数

包括SVG到LaTeX

我想在LaTeX文档中包含一个svg文件.

a.svg(给定)

given.svg

a.pdf(目标)

goal.pdf 我使用OpenOffice创建了表,将其导出为pdf文件,然后将其导入到inkscape中并将其保存为svg文件.

我试过了什么

直接包含svg

我尝试使用svg包直接包含给定的svg文件:

\usepackage{svg}
...
\includesvg{img/a}
Run Code Online (Sandbox Code Playgroud)

但它没有编译,因为pdflatex没有找到文件a.我也试过a.svg但没有任何成功:(

导出为pdf"即时"

J. Engelen之后,我尝试使用带有-enable-write18或--shell-escape的pdflatex生成pdf文件,但除了抛出错误之外,它没有对.svg文件做任何操作,缺少.pdf_tex文件.

在包括之前导出为pdf/pdf_tex

我使用inkscape v.0.92导出了svg文件:

inkscape -D -z --file = a.svg --export-pdf = a.pdf --export-latex

我有一个包含空白表的.pdf文件: 原始的pdf文件 以及包含以下内容的.pdf_tex文件:

%% Creator: Inkscape inkscape 0.92.1, www.inkscape.org
%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010
%% Accompanies image file 'RLE1.pdf' (pdf, eps, ps)
%%
%% To include the image in your LaTeX document, write
%%   \input{<filename>.pdf_tex}
%%  instead of
%%   \includegraphics{<filename>.pdf}
%% To scale the image, …
Run Code Online (Sandbox Code Playgroud)

pdf svg latex

9
推荐指数
2
解决办法
2万
查看次数

Google 基准框架不优化

void DoNotOptimize我对Google Benchmark Framework 的功能实现有点困惑(定义来自这里):

template <class Tp>
inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp const& value) {
  asm volatile("" : : "r,m"(value) : "memory");
}

template <class Tp>
inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp& value) {
#if defined(__clang__)
  asm volatile("" : "+r,m"(value) : : "memory");
#else
  asm volatile("" : "+m,r"(value) : : "memory");
#endif
}
Run Code Online (Sandbox Code Playgroud)

因此,它具体化了变量,如果变量非常量,也会告诉编译器忘记有关其先前值的任何信息。("+r"是 RMW 操作数)。

并且总是使用"memory"clobber,这是编译器对重新排序加载/存储的障碍,即确保所有全局可访问的对象的内存与 C++ 抽象机同步,并假设它们也可能已被修改。


我距离成为低级代码专家还很远,但据我了解其实现,该函数充当读/写屏障。因此,基本上,它确保传入的值位于寄存器或内存中。

虽然如果我想保留函数的结果(应该进行基准测试),这似乎是完全合理的,但我对编译器留下的自由度感到有点惊讶。

我对给定代码的理解是,编译器可能会在DoNotOptimize调用时插入物化点,这意味着重复执行时(例如,在循环中)会产生大量开销。当不应优化的值只是单个标量值时,如果编译器确保该值驻留在寄存器中似乎就足够了。

区分指针和非指针不是一个好主意吗?例如:

template< class T >
inline __attribute__((always_inline)) 
void do_not_optimize( …
Run Code Online (Sandbox Code Playgroud)

c++ assembly inline-assembly microbenchmark google-benchmark

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

使用 CMake 从静态库中包含头文件

我在使用静态库构建 CMake 项目时遇到问题。我的项目结构看起来像这样:

Foo/
|-- CMakeLists.txt
|-- lib/
    |-- CMakeLists.txt
    |-- libA/
        |-- CMakeLists.txt
        |-- libA.cpp
        |-- libA.h
        |-- libAB.h
|-- src/
    |-- CMakeLists.txt
    |-- main.cpp
    |-- srcDirA/
        |-- CMakeLists.txt
        |-- srcA.h
    |-- srcDirB/
        |-- CMakeLists.txt
        |-- srcB.cpp
        |-- srcB.h
Run Code Online (Sandbox Code Playgroud)

而 */CMakeLists.txt 看起来像这样:

Foo/CMakeLists.txt:

cmake_minimum_required(VERSION 3.5.1)
project(FOO)

set(CMAKE_CXX_STANDARD 11)

add_subdirectory(lib)
add_subdirectory(src)
Run Code Online (Sandbox Code Playgroud)

Foo/lib/CMakeLists.txt:

add_subdirectory(libA)
Run Code Online (Sandbox Code Playgroud)

Foo/lib/libA/CMakeLists.txt:

add_library (staticLibA STATIC libA.cpp)
Run Code Online (Sandbox Code Playgroud)

Foo/src/CMakeLists.txt:

add_subdirectory(srcDirA)
add_subdirectory(srcDirB)
include_directories(".")

add_executable(foo main.cpp)
target_link_libraries(foo LINK_PUBLIC libA)
Run Code Online (Sandbox Code Playgroud)

Foo/src/srcDirA/CMakeLists.txt 为空

Foo/src/srcDirB/CMakeLists.txt 为空

现在我试图将我的静态库中的标头包含到我的主项目中,如下所示:

Foo/src/main.cpp:

#include "srcDirB/srcB.h"
#include "libA/libA.h"  

int main() { …
Run Code Online (Sandbox Code Playgroud)

c++ cmake include static-libraries

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

在 C++ 中重载位移运算符

我想为uint32x4_tarm_neon.h.

struct uint32x4_t {
   uint32_t val[4];
};
Run Code Online (Sandbox Code Playgroud)

这应该通过调用 SIMD 函数来完成,该函数期望值移位和常量立即数:

uint32x4_t simdShift(uint32x4_t, constant_immediate);
Run Code Online (Sandbox Code Playgroud)

移位.h

#ifndef SHIFT_H
#define SHIFT_H

namespace A {
   namespace B {
      /*uint32x4_t simdLoad(uint32_t*) {
         ...
      }*/

      template<int N>
      uint32x4_t shiftRight(uint32x4_t vec) {
        return vshrq_n_u32(vec,N);
      }
   }
}
uint32x4_t operator>>(uint32x4_t const & vec, const int v) {
  return A::B::shiftRight<v>(vec);
}
#endif
Run Code Online (Sandbox Code Playgroud)

主程序

#include "shift.h"

int main() {
   uint32_t* data = new uint32_t[4];
   data[0] = 1;
   data[1] = 2;
   data[2] = 3;
   data[3] = 4; …
Run Code Online (Sandbox Code Playgroud)

c++ arm operator-overloading simd c++14

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

将数组的原始指针转换为unique_ptr

我正在使用黑盒框架(cdg),它填充了一组uint32_t带有值的数组.电话看起来像这样:

std::size_t dataCount = 100;
uint32_t* data = new uint32_t[dataCount];
cdg.generate(data);
Run Code Online (Sandbox Code Playgroud)

不幸的是,框架不使用模板,所以我必须传入一个uint32_t*.为了摆脱原始指针,我想把它"包装"成一个std::unique_ptr<uint32_t>.因此,我认为我必须使用一个阵列 std::unique_ptr<uint32_t[]>.有没有办法将原始指针转换为unique_ptr或者我应该这样做:

const std::size_t dataCount = 100;
std::unique_ptr<uint32_t[]> data = std::make_unique<uint_32_t[]>(dataCount);
cdg.generate(data.get());
Run Code Online (Sandbox Code Playgroud)

c++ arrays pointers unique-ptr c++14

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

存储浮点的最佳方法

我有一个必须存放4个花车的课程.将浮点数存储在数组中还是作为类的4个成员更有效?特别是与stl-containers和参数传递相结合.

c++ floating-point stl

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