我正在玩新的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) 我想在LaTeX文档中包含一个svg文件.
我使用OpenOffice创建了表,将其导出为pdf文件,然后将其导入到inkscape中并将其保存为svg文件.
我尝试使用svg包直接包含给定的svg文件:
\usepackage{svg}
...
\includesvg{img/a}
Run Code Online (Sandbox Code Playgroud)
但它没有编译,因为pdflatex没有找到文件a.我也试过a.svg但没有任何成功:(
继J. Engelen之后,我尝试使用带有-enable-write18或--shell-escape的pdflatex生成pdf文件,但除了抛出错误之外,它没有对.svg文件做任何操作,缺少.pdf_tex文件.
我使用inkscape v.0.92导出了svg文件:
inkscape -D -z --file = a.svg --export-pdf = a.pdf --export-latex
我有一个包含空白表的.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) 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
我在使用静态库构建 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) 我想为uint32x4_t在arm_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) 我正在使用黑盒框架(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) 我有一个必须存放4个花车的课程.将浮点数存储在数组中还是作为类的4个成员更有效?特别是与stl-containers和参数传递相结合.