小编Jak*_*ský的帖子

C ++ 20 constexpr std :: copy运行时优化

cppreference.com说:

实际上,如果值类型为TriviallyCopyable,则std :: copy的实现应避免多次分配,并使用大容量复制功能,例如std :: memmove

但是,该页面还指出,不采用执行策略的重载将constexpr自C ++ 20开始。该标准是否会禁止这些运行时优化(因为std::memmove不是constexpr),或者是否有一种方法可以优化constexpr运行时的功能?

c++ optimization constexpr c++20

28
推荐指数
1
解决办法
882
查看次数

Slurm 中的 GPU 分配:--gres 与 --gpus-per-task,以及 mpirun 与 srun

Slurm 中有两种分配 GPU 的方式:要么是通用--gres=gpu:N参数,要么是特定参数,如--gpus-per-task=N. 还有两种方法可以在批处理脚本中启动 MPI 任务:使用srun或使用通常的方法mpirun(当 OpenMPI 是使用 Slurm 支持进行编译时)。我发现这些方法之间的行为存在一些令人惊讶的差异。

我正在提交一个批处理作业,其中sbatch基本脚本如下:

#!/bin/bash

#SBATCH --job-name=sim_1        # job name (default is the name of this file)
#SBATCH --output=log.%x.job_%j  # file name for stdout/stderr (%x will be replaced with the job name, %j with the jobid)
#SBATCH --time=1:00:00          # maximum wall time allocated for the job (D-H:MM:SS)
#SBATCH --partition=gpXY        # put the job into the gpu partition
#SBATCH --exclusive             # request exclusive …
Run Code Online (Sandbox Code Playgroud)

gpu nvidia cluster-computing openmpi slurm

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

在C ++ 14中继承模板化的operator =:g ++和clang ++的不同行为

我有这段代码可以在GCC 9.1中正常工作:

#include <type_traits>

template< typename T >
class A
{
protected:
    T value;

public:
    template< typename U,
              typename...,
              typename = std::enable_if_t< std::is_fundamental< U >::value > >
    A& operator=(U v)
    {
        value = v;
        return *this;
    }
};

template< typename T >
class B : public A<T>
{
public:
    using A<T>::operator=;

    template< typename U,
              typename...,
              typename = std::enable_if_t< ! std::is_fundamental< U >::value > >
    B& operator=(U v)
    {
        this->value = v;
        return *this;
    }
};

int main()
{
    B<int> obj; …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer overload-resolution name-hiding c++14

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

clang++ 8.0.1 自分配重载警告

考虑这段代码:

class Vector {
public:
    Vector& operator+=(const Vector &v) { return *this; }
    Vector& operator-=(const Vector &v) { return *this; }
    Vector& operator*=(const Vector &v) { return *this; }
    Vector& operator/=(const Vector &v) { return *this; }
};

int main()
{
    Vector v;
    v += v;
    v -= v;
    v *= v;
    v /= v;
}
Run Code Online (Sandbox Code Playgroud)

当使用 clang++ 8.0.1 编译时,我收到以下警告:

$ clang++ -Wall example2.cpp -o example2
example2.cpp:13:7: warning: explicitly assigning value of variable of type 'Vector' to
      itself [-Wself-assign-overloaded]
    v …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-warnings clang++

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

具有执行策略的 std::exclusive_scan 无法就地工作

cppreference 对于std::exclusive_scan是这样说的:

d_first - 目标范围的开始;可能等于第一个

std::exclusive_scan所以在“就地”模式下使用覆盖存储应该没有问题。但是,对于 GCC 12.2.0 附带的 libstdc++ 实现,它无法与使用执行策略的重载一起使用,即使它是std::execution::seq. 考虑这个例子:

#include <algorithm>
#include <numeric>
#include <execution>
#include <vector>
#include <cassert>

int main()
{
    const int size = 10;
    std::vector<int> vec(size);

    // without execution policy
    std::fill(vec.begin(), vec.end(), 1);
    std::exclusive_scan(vec.begin(), vec.end(), vec.begin(), 0);
    assert(vec[0] == 0); // the first element should be 0
    assert(vec[size-1] == size-1); // the last element should be the sum

    // sequential execution policy
    std::fill(vec.begin(), vec.end(), 1);
    std::exclusive_scan(std::execution::seq, vec.begin(), vec.end(), vec.begin(), …
Run Code Online (Sandbox Code Playgroud)

c++ parallel-processing c++17

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