小编Nit*_*lly的帖子

错误的单线程内存带宽基准

为了测量主存储器的带宽,我提出了以下方法。

代码(针对英特尔编译器)

#include <omp.h>

#include <iostream> // std::cout
#include <limits> // std::numeric_limits
#include <cstdlib> // std::free
#include <unistd.h> // sysconf
#include <stdlib.h> // posix_memalign
#include <random> // std::mt19937


int main()
{
    // test-parameters
    const auto size = std::size_t{150 * 1024 * 1024} / sizeof(double);
    const auto experiment_count = std::size_t{500};
    
    //+/////////////////
    // access a data-point 'on a whim'
    //+/////////////////
    
    // warm-up
    for (auto counter = std::size_t{}; counter < experiment_count / 2; ++counter)
    {
        // garbage data allocation and memory page loading …
Run Code Online (Sandbox Code Playgroud)

c++ benchmarking assembly performance-testing memory-bandwidth

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

具有独特矩阵转置问题的 2D 分块

struct complex {double real = 0.0; double imag = 0.0;};我有以 3 阶张量形式组织的类型的复杂值数据。底层容器具有与内存页边界对齐的连续内存布局。

张量的自然“切片”方向是沿着方向 1。这意味着缓存行按方向 3、2 和最后 1 的顺序延伸。换句话说,索引函数如下所示:(i, j, k) -> i * N2 * N3 + j * N3 + k在此输入图像描述 在此输入图像描述

我需要沿方向 2 转置切片。在上面的第一张图像中,红色矩形是我希望转置的张量的切片。

我的 C++ 代码如下所示:

for (auto vslice_counter = std::size_t{}; vslice_counter < n2; ++vslice_counter)
    {        
        // blocked loop
        for (auto bi1 = std::size_t{}; bi1 < n1; bi1 += block_size)
        {
            for (auto bi3 = std::size_t{}; bi3 < n3; bi3 += block_size)
            {
                for (auto …
Run Code Online (Sandbox Code Playgroud)

c++ performance caching transpose performance-testing

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

解释为什么有效 DRAM 带宽在添加 CPU 后会减少

这个问题是此处发布的问题的衍生问题:Measurement Bandwidth on a ccNUMA system

我为配备 2 个 Intel(R) Xeon(R) Platinum 8168 的 ccNUMA 系统上的内存带宽编写了一个微基准测试:

  1. 24 核 @ 2.70 GHz,
  2. 一级缓存 32 kB,二级缓存 1 MB,三级缓存 33 MB。

作为参考,我使用 Intel Advisor 的屋顶线图,它描述了每个可用 CPU 数据路径的带宽。据此计算,带宽为230GB/s。

带宽的强大扩展: 在此输入图像描述

问题:如果您查看强扩展图,您可以看到峰值有效带宽实际上是在 33 个 CPU 上实现的,之后添加 CPU 只会降低峰值有效带宽。为什么会发生这种情况?

parallel-processing performance intel cpu-architecture numa

3
推荐指数
1
解决办法
865
查看次数

基于 OpenMP 的循环,缩减规模较差

我有一个循环,我正在尝试与 OpenMP 有效地并行化。它涉及累积矢量流的 L2 范数,并进行缩减。这是循环:

struct vec3
{
    float data[3] = {};
};

float accumulate_eta_sq_t_mass(const vec3* etas, const float* masses, const std::size_t& n)
{
    auto a = 0.0;
    #pragma omp parallel for simd safelen(16) reduction(+:a)
    for (auto ii = std::size_t{}; ii < n; ++ii)
    {
        const auto& eta = etas[ii];
        const auto x = static_cast<double>(eta.data[0]);
        const auto y = static_cast<double>(eta.data[1]);
        const auto z = static_cast<double>(eta.data[2]);
        const auto m = static_cast<double>(masses[ii]);
        
        a += (x * x + y * y + …
Run Code Online (Sandbox Code Playgroud)

c++ benchmarking openmp performance-testing parallelism-amdahl

3
推荐指数
1
解决办法
111
查看次数