小编He3*_*xxx的帖子

AttributeError:模块“setuptools._distutils”没有属性“version”

我试图使用张量板训练模型。执行时,我收到此错误:

$ python train.py 
Traceback (most recent call last):
  File "train.py", line 6, in <module>
    from torch.utils.tensorboard import SummaryWriter  
  File "C:\Users\91960\AppData\Local\Programs\Python\Python38\lib\site-packages\torch\utils\tensorboard\__init__.py", line 4, in <module>
    LooseVersion = distutils.version.LooseVersion 

AttributeError: module 'setuptools._distutils' has no attribute 'version'.
Run Code Online (Sandbox Code Playgroud)

我正在使用 python 3.8.9 64 位和张量流,并且已经安装了张量板所需的 distutils。

为什么会发生这种情况?

python distutils tensorflow tensorboard

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

为什么 C++20 的 `std::popcount` 仅限于无符号类型?

P0553R4中的功能:位运算仅限于无符号整数。该提案没有给出这一限制的理由。我可以看到,如果没有定义有符号整数的位表示,这是有意义的,但使用 C++20,我们可以保证有符号整数使用二进制补码。

对我来说,允许使用有符号整数类型调用eg似乎是合理的std::popcount,因为实现可以简单地转换为相应的无符号类型以在无符号域中执行位操作。

P0553R4添加这个约束的原因是什么?(只是 P0553R4 和 P0907R4 之间缺少同步吗?)

c++ language-design language-lawyer c++20

41
推荐指数
2
解决办法
4990
查看次数

Clang:将 bool[64] 数组自动矢量化转换为 uint64_t 位掩码

我想将 a 转换bool[64]为 a uint64_t,其中每个位代表输入数组中元素的值。

在现代 x86 处理器上,这可以非常有效地完成,例如vptestmd与 AVX512 或vpmovmskbAVX256 一起使用。当我将 clang 的 bool 向量扩展与 结合使用时__builtin_convertvector,我对结果感到满意:

uint64_t handvectorized(const bool* input_) noexcept {
    const bool* __restrict input = std::assume_aligned<64>(input_);

    using VecBool64 __attribute__((vector_size(64))) = char;
    using VecBitmaskT __attribute__((ext_vector_type(64))) = bool;

    auto input_vec = *reinterpret_cast<const VecBool64*>(input);
    auto result_vec = __builtin_convertvector(input_vec, VecBitmaskT);    

    return reinterpret_cast<uint64_t&>(result_vec);
}
Run Code Online (Sandbox Code Playgroud)

产生(Godbolt):

vmovdqa64  zmm0, zmmword ptr [rdi]
vptestmb   k0, zmm0, zmm0
kmovq      rax, k0
vzeroupper
ret
Run Code Online (Sandbox Code Playgroud)

但是,我无法让 clang (或 …

c++ clang compiler-optimization avx2 avx512

9
推荐指数
0
解决办法
211
查看次数

Clang++:为什么在添加另一个结构成员时这个 memcpy 循环惯用法没有优化?

鉴于此代码片段

#include <cstdint>
#include <cstddef>

struct Data {
  uint64_t a;
  //uint64_t b;
};

void foo(
    void* __restrict data_out,
    uint64_t* __restrict count_out,
    std::byte* __restrict data_in,
    uint64_t count_in)
{
  for(uint64_t i = 0; i < count_in; ++i) {
    Data value = *reinterpret_cast<Data* __restrict>(data_in + sizeof(Data) * i);
    static_cast<Data* __restrict>(data_out)[(*count_out)++] = value;
  }
}
Run Code Online (Sandbox Code Playgroud)

clang 用 memcpy 调用替换循环foo,正如预期的那样 ( godbolt ),给出 Rpass 输出:

example.cpp:16:59: remark: Formed a call to llvm.memcpy.p0.p0.i64() intrinsic from load and store instruction in _Z3fooPvPmPSt4bytem function [-Rpass=loop-idiom]
    static_cast<Data* …
Run Code Online (Sandbox Code Playgroud)

c++ clang compiler-optimization

5
推荐指数
0
解决办法
249
查看次数

预处理:定义“import”的简写是否合法?

为了解决代码高尔夫挑战,我想生成尽可能小的代码。我有定义一个简写的想法import

#define I import
I<vector>;
Run Code Online (Sandbox Code Playgroud)

简短的 Godbolt 示例

当然,这里的意图是重用I以实际节省字节。

这在 C++20 中合法吗?

想法/到目前为止我发现的:

  • 根据 cppreference,“模块和导入指令也是预处理指令”。所以我认为这可以归结为我们是否保证预处理器首先必须用我们的定义替换 I 的问题?
  • 我认为处理import指令应该在翻译阶段 4 中进行,并且对于整个阶段,I除非另有说明([cpp.pre]-7),否则不应进行宏扩展。对于这种情况,是否另有规定?
  • 这有可能作为预处理器重新扫描的一部分吗?
  • Godbolt 上的 Clang 和 GCC 无法编译,但 AFAIK 尚不支持在没有额外步骤的情况下导入标准库头文件,并且它们给出了与速记版本相同的错误消息,这表明它可以工作(?)
  • 相同的方法,但使用include而不是import,不适用于 gcc 和 clang,因此可能不合法。

c++ language-lawyer c-preprocessor c++20

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

g++ 与 MS c++ 中的未初始化指针

最近,我阅读了一个编码示例,其中解释了以下内容会导致 Visual Studio 中的编译器错误:

int* pointer1;
*pointer1 = 10;
Run Code Online (Sandbox Code Playgroud)

作者声称由于pointer1在解引用之前未初始化,所以在Visual Studio中出现如下错误:

C4700:使用了未初始化的局部变量“pointer1”

确实如此。这个场景是有道理的。

但是,如果我使用完全相同的代码并使用 g++ 进行编译,则不会发生编译器错误并且我可以pointer1以任何正常方式自由使用。

为什么会有差异?g++ 是否pointer1在初始化之前分配了地址?

c++ pointers initialization g++ gcc-warning

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