考虑以下继承:
class Base {
protected:
Base() { }
public:
double Multiply(double x);
};
class Derived : public Base {
double _value;
public:
Derived(double init) : _value(init) { }
double Multiply(double x) { return x*_value; }
};
Run Code Online (Sandbox Code Playgroud)
此代码段将用于模板化代码库.多态性不是一种选择,因为它添加了VTable指针,从而使内存消耗增加了一倍.
但是,我怀疑由于C++要求对象的大小至少为1个字节,因此大小Derived将变为9个字节,因此,由于填充/对齐,它将进一步变为16个字节.
那么在C++中有一种方法可以保持大小Derived等于double(通常为8个字节)的大小吗?标准说的大小是Derived什么?特别是,在这种情况下,MSVC++如何表现?
x86_64 上是否有针对 32 位和 64 位值的非临时加载(即直接从 DRAM 加载,无需缓存)的 C/C++ 内在函数?
我的编译器是MSVC++2017工具集v141。但其他编译器的内在函数以及对底层汇编指令的引用也是受欢迎的。
你能描述一下x86_64上WC和WB内存的含义和区别吗?为了完整起见,请在x86_64上描述其他类型的内存,如果有的话.
请考虑以下代码
template<bool b, typename T> void foo(const T& t = []() {}) {
// implementation here
}
void bar() {
foo<true>([&](){ /* implementation here */ }); // this compiles
foo<true>(); // this doesn't compile
}
Run Code Online (Sandbox Code Playgroud)
在不编译的情况下,我得到以下错误:
error C2672: 'foo': no matching overloaded function found
error C2783: 'void foo(const T&)': could not deduce template argument for 'T'
Run Code Online (Sandbox Code Playgroud)
我认为我想要实现的目标很明确:让我们foo在没有客户提供的lambda的情况下调用它.编译器是MSVC++ 2017版本15.4.4工具集v141.
早些时候我安装CUDA 9.2在我的机器上并用它构建了一个解决方案。然后我升级Visual Studio 2017到了 不支持的修订版CUDA 9.2,所以我收到如下错误:
1>D:\Dev\Views\Engines\ProbQA\ProbQA\PqaCore>"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\bin\nvcc.exe" -gencode=arch=compute_61,code=\"sm_61,compute_61\" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\HostX64\x64" -x cu -rdc=true -ID:\Dev\Views\Engines\ProbQA\ProbQA\PqaCore\ -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.2\include" --source-in-ptx -G -lineinfo --keep-dir x64\Debug -maxrregcount=32 --machine 64 --compile -cudart static -g -D_DEBUG -D_WINDOWS -D_USRDLL -DPQACORE_EXPORTS -D_WINDLL -D_UNICODE -DUNICODE -Xcompiler "/EHsc /W4 /nologo /Od /FS /Zi /RTC1 /MDd /GR" -o x64\Debug\CudaEngineGpu.cu.obj "D:\Dev\Views\Engines\ProbQA\ProbQA\PqaCore\CudaEngineGpu.cu"
1>c:\program files\nvidia gpu computing …Run Code Online (Sandbox Code Playgroud) 有没有办法FILE*根据WinAPI CreateFile在C++中返回的句柄创建stdio的结构?
考虑以下代码,其中a是一个参数数组,float并且s是一个最初未初始化的结果数组float:
s[n - 1] = mu * a[n - 1];
for (int j = n - 2; j >= 0; j--)
s[j] = mu * (a[j] + s[j + 1]);
return s;
Run Code Online (Sandbox Code Playgroud)
有没有机会用SIMD(AVX2)改善这种重复代码的性能?
编辑:我后来发现这个公式/算法被称为"折扣金额",但无法在互联网上找到它的并行版本.
以下命令
/usr/bin/arm-linux-gnueabihf-gcc -O3 -DNDEBUG -march=armv7-a -mfloat-abi=hard -fPIC -fno-builtin -fno-exceptions -fomit-frame-pointer -funwind-tables -fno-stack-protector -fvisibility=hidden -fvisibility-inlines-hidden -fno-function-sections -fno-lto -g -Wno-variadic-macros -Wno-non-virtual-dtor -o testAsm.S.o -c testAsm.S
Run Code Online (Sandbox Code Playgroud)
在以下程序集文件中testAsm.S:
.syntax unified
.arch armv7
.fpu vfpv3
.code 32
.global _functionPointer
.p2align 2
.global _asmFunction
.type _asmFunction, %function
_asmFunction:
PUSH {r1-r3,lr}
VPUSH {d0-d7}
MOVW r1,#:lower16:_functionPointer
MOVT r1,#:upper16:_functionPointer
LDR r2, [r1]
CMP r2, #0
BEQ asmFunction_restore
MOV r1, #0
BLX r2
asmFunction_restore:
VPOP {d0-d7}
POP {r1-r3,pc}
Run Code Online (Sandbox Code Playgroud)
每条指令产生以下错误
错误:尝试在仅Thumb处理器上使用ARM指令
具体来说,下面是输出:
testAsm.S: Assembler messages:
testAsm.S:10: Error: attempt to …Run Code Online (Sandbox Code Playgroud) 文档的cudaHostAlloc()说,与cudaHostAllocMapped标志它分配固定的主机和“地图分配到CUDA地址空间的”内存。这是否意味着在设备上也分配了镜像缓冲区?无论是在通话中cudaHostAlloc()还是cudaHostGetDevicePointer()通话中。或者设备是否在每次访问由 返回的指针时与主机内存进行通信cudaHostGetDevicePointer()?
这个问题不同于何时使用 cudaHostRegister() 和 cudaHostAlloc()?“Pinned or page-locked”内存是什么意思?哪些是 OpenCL 中的等价物?因为我不问 API 是什么、何时使用它们或什么是固定内存。我特别询问是否在 GPU 上分配了镜像缓冲区。
文档在这里_alloca()说:
_alloca 例程返回一个指向已分配空间的 void 指针,保证该空间能够适当对齐以存储任何类型的对象。
然而,这里说:
_alloca 需要 16 字节对齐,并且还需要使用帧指针。
因此,似乎在第一个参考文献中,他们忘记了 32 字节对齐的 AVX/AVX2 类型,例如__m256d.
另一件让我困惑的事情是,第一页说_alloca()已弃用,而它建议使用可以从堆而不是堆栈分配内存的函数(这在我的多线程应用程序中是不可接受的)。
那么有人可以指出我是否有一些现代的(也许是新的 C/C++ 标准?)方法来对齐堆栈内存分配?
说明 1:请不要提供需要数组大小为编译时常量的解决方案。我的函数根据运行时参数值分配可变数量的数组项。
c++ ×7
assembly ×3
c++17 ×2
cpu-cache ×2
cuda ×2
memory ×2
alloca ×1
arm ×1
avx2 ×1
build ×1
c ×1
c11 ×1
createfile ×1
file ×1
fopen ×1
gcc ×1
generics ×1
inheritance ×1
intrinsics ×1
lambda ×1
pci-e ×1
performance ×1
simd ×1
size ×1
sizeof ×1
templates ×1
thumb ×1
upgrade ×1
winapi ×1
x86-64 ×1