小编Ser*_*tch的帖子

测试AVX寄存器是否包含一些相等的整数

考虑一个包含四个64位整数的256位寄存器.在AVX/AVX2中是否可以有效地测试这些整数中的一些是否相等?

例如:

a){43, 17, 25, 8}:结果必须是false因为4个数字中没有2个相等.

b){47, 17, 23, 17}:结果必须为"true",因为17在AVX向量寄存器中数字出现2次.

如果可能的话,我想在C++中这样做,但如果有必要,我可以下载到汇编.

c++ x86 simd avx avx2

4
推荐指数
1
解决办法
400
查看次数

使用与new中使用的类型不同的指针删除内存是否安全?

以下代码是否安全?有没有提到C++标准来解决这个问题?

// SomeStruct is POD: no constructors or destructor
SomeStruct *pSS = new SomeStruct();
void *pV = reinterpret_cast<void*>(pSS);
delete pV;
Run Code Online (Sandbox Code Playgroud)

c++ heap-memory new-operator delete-operator

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

返回引用是否也会延长其生命周期?

AFAIK,在以下代码中,引用的生命周期ro1延长到范围结束(函数g()):

class Some {
  // Implementation here
};
Some f() {
  return Some(/* constructor parameters here*/);
}
void g() {
  Some&& ro1 = f();
  // ro1 lives till the end of this function
}
Run Code Online (Sandbox Code Playgroud)

如何返回此引用?物体是否仍然存在g1(),或者在退出时h()是否会被破坏?

Some&& h() {
  Some&& ro1 = f();
  // Code skipped here
  return std::forward<Some>(ro1);
}

void g1() {
  Some&& ro2 = h();
  // Is ro2 still refering to a valid object?
}
Run Code Online (Sandbox Code Playgroud)

c++ reference lifetime rvalue-reference c++17

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

用于装配VMOVD的C/C++内在函数

如何(在C/C++中)将32位整数加载到SSE寄存器的低32位,而其余的未定义?我的意思是vmovd xmm0, eax效率相同.

c++ x86 assembly sse vectorization

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

C/C++打印自定义EOL

我想在Windows上为UNIX生成一个文件(脚本).所以我需要只输出LF字符,而不输出CR字符.

当我这样做时fprintf(fpout, "some text\n");,字符\n会自动替换\r\n为文件.

有没有办法输出特定的just \n(LF)字符?

语言是C++,但I/O函数来自C.

c c++ printf eol output

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

C++指向const指针的指针

我仍然困惑在哪里放置const指向多个间接的指针.有人可以澄清吗?

例如,我现在需要一个指向const指针的指针,这意味着int **ppTargets我可以为其赋值int *pTargets变量,例如:

int foo(int **ppTargets) {
    int *pTargets = /* calculate here */;
    *ppTargets = pTargets;
    return 37; // just e.g.
}
Run Code Online (Sandbox Code Playgroud)

上面的代码缺乏const.所以在foo我想pTargets指向常量内存并且在初始化之后是不可分配的(因此无法写入例如pTargets++),那就是int const *const pTargets = /* assigned once */.接下来我想声明ppTargetsppTargets本身可以被分配,但是*ppTargets只能被读取.

换句话说,在我想要的来电代码中:

int const* pTargets;
foo(&pTargets);
Run Code Online (Sandbox Code Playgroud)

我试图声明foo如下,但得到一个错误you cannot assign to a variable that is const:

int foo(int *const *const ppTargets)
Run Code Online (Sandbox Code Playgroud)

c c++ pointers const

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

MiniDumpWriteDump() 挂起

如果堆分配/释放/重新分配正在另一个线程中进行,DbgHelp 库的 MiniDumpWriteDump() 将挂起。下面是调用堆栈:DbgHelp 暂停其他线程,然后无限期地等待这些线程获得的互斥体。

    ntdll.dll!NtWaitForAlertByThreadId()   Unknown
    ntdll.dll!RtlpWaitOnAddressWithTimeout()    Unknown
    ntdll.dll!RtlpWaitOnAddress()   Unknown
    ntdll.dll!RtlpWaitOnCriticalSection()   Unknown
    ntdll.dll!RtlpEnterCriticalSectionContended()  Unknown
    ntdll.dll!RtlEnterCriticalSection()    Unknown
    ntdll.dll!RtlpReAllocateHeap()  Unknown
    ntdll.dll!RtlpReAllocateHeapInternal()  Unknown
    ntdll.dll!RtlReAllocateHeap()   Unknown
    ntdll.dll!LdrpSetAlternateResourceModuleHandle()    Unknown
    ntdll.dll!LdrResGetRCConfig()   Unknown
    ntdll.dll!LdrpResSearchResourceMappedFile() Unknown
    ntdll.dll!LdrResSearchResource()    Unknown
    KernelBase.dll!FindVersionResourceSafe()   Unknown
>   KernelBase.dll!GetFileVersionInfoSizeExW()  Unknown
    dbgcore.dll!Win32LiveSystemProvider::GetImageVersionInfo(void *,unsigned short const *,unsigned __int64,struct tagVS_FIXEDFILEINFO *)   Unknown
    dbgcore.dll!GenAllocateModuleObject(struct _MINIDUMP_STATE *,struct _INTERNAL_PROCESS *,unsigned short *,unsigned __int64,unsigned long,struct _INTERNAL_MODULE * *)    Unknown
    dbgcore.dll!GenGetProcessInfo(unsigned long,struct _MINIDUMP_STATE *,struct _INTERNAL_PROCESS * *,struct _LIST_ENTRY *) Unknown
    dbgcore.dll!MiniDumpProvideDump()  Unknown
    dbgcore.dll!MiniDumpWriteDump()    Unknown
Run Code Online (Sandbox Code Playgroud)

您知道解决这种情况的简单方法吗?我可以看到一种解决方法,即向应用程序中的所有其他线程注入检查,以查看是否请求核心转储,然后在未获取互斥锁的位置暂停。但这是一个很大的变化,而且应用程序的一些线程超出了我的控制范围,因为它们是由我用于内部使用的库启动的。

c++ winapi coredump deadlock dbghelp

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

如何在CUDA中打包(有效)?

我有一个字节数组,其中每个字节都是0或1.现在我想将这些值打包成位,这样8个原始字节占用1个目标字节,原始字节0进入位0,字节1进入位1,到目前为止,我在内核中有以下内容:

const uint16_t tid = threadIdx.x;
__shared__ uint8_t packing[cBlockSize];

// ... Computation of the original bytes in packing[tid]
__syncthreads();

if ((tid & 4) == 0)
{
    packing[tid] |= packing[tid | 4] << 4;
}
if ((tid & 6) == 0)
{
    packing[tid] |= packing[tid | 2] << 2;
}
if ((tid & 7) == 0)
{
    pOutput[(tid + blockDim.x*blockIdx.x)>>3] = packing[tid] | (packing[tid | 1] << 1);
}
Run Code Online (Sandbox Code Playgroud)

这是正确有效的吗?

c++ parallel-processing cuda bit-packing

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

用于 x86_64 上 32 位和 64 位值的非临时加载的 C/C++ 内在函数?

x86_64 上是否有针对 32 位和 64 位值的非临时加载(即直接从 DRAM 加载,无需缓存)的 C/C++ 内在函数?

我的编译器是MSVC++2017工具集v141。但其他编译器的内在函数以及对底层汇编指令的引用也是受欢迎的。

c c++ assembly intrinsics cpu-cache

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

如何在 Visual Studio 解决方案中升级 CUDA 版本?

早些时候我安装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)

cuda upgrade build visual-studio

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