我试图使用张量板训练模型。执行时,我收到此错误:
$ 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。
为什么会发生这种情况?
P0553R4中的功能:位运算仅限于无符号整数。该提案没有给出这一限制的理由。我可以看到,如果没有定义有符号整数的位表示,这是有意义的,但使用 C++20,我们可以保证有符号整数使用二进制补码。
对我来说,允许使用有符号整数类型调用eg似乎是合理的std::popcount,因为实现可以简单地转换为相应的无符号类型以在无符号域中执行位操作。
P0553R4添加这个约束的原因是什么?(只是 P0553R4 和 P0907R4 之间缺少同步吗?)
我想将 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 (或 …
鉴于此代码片段
#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) 为了解决代码高尔夫挑战,我想生成尽可能小的代码。我有定义一个简写的想法import:
#define I import
I<vector>;
Run Code Online (Sandbox Code Playgroud)
当然,这里的意图是重用I以实际节省字节。
这在 C++20 中合法吗?
想法/到目前为止我发现的:
import指令应该在翻译阶段 4 中进行,并且对于整个阶段,I除非另有说明([cpp.pre]-7),否则不应进行宏扩展。对于这种情况,是否另有规定?include而不是import,不适用于 gcc 和 clang,因此可能不合法。最近,我阅读了一个编码示例,其中解释了以下内容会导致 Visual Studio 中的编译器错误:
int* pointer1;
*pointer1 = 10;
Run Code Online (Sandbox Code Playgroud)
作者声称由于pointer1在解引用之前未初始化,所以在Visual Studio中出现如下错误:
C4700:使用了未初始化的局部变量“pointer1”
确实如此。这个场景是有道理的。
但是,如果我使用完全相同的代码并使用 g++ 进行编译,则不会发生编译器错误并且我可以pointer1以任何正常方式自由使用。
为什么会有差异?g++ 是否pointer1在初始化之前分配了地址?
c++ ×5
c++20 ×2
clang ×2
avx2 ×1
avx512 ×1
distutils ×1
g++ ×1
gcc-warning ×1
pointers ×1
python ×1
tensorboard ×1
tensorflow ×1