小编sz *_*ter的帖子

多线程程序停留在优化模式下,但在-O0下正常运行

我编写了一个简单的多线程程序,如下所示:

static bool finished = false;

int func()
{
    size_t i = 0;
    while (!finished)
        ++i;
    return i;
}

int main()
{
    auto result=std::async(std::launch::async, func);
    std::this_thread::sleep_for(std::chrono::seconds(1));
    finished=true;
    std::cout<<"result ="<<result.get();
    std::cout<<"\nmain thread id="<<std::this_thread::get_id()<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)

它通常表现在调试模式下在Visual Studio中-O0GC c和后打印出的结果1秒钟。但是它卡住了,在“ 释放”模式或中不打印任何内容-O1 -O2 -O3

c++ multithreading thread-safety data-race

67
推荐指数
3
解决办法
5653
查看次数

函数模板接受并返回不同的 lambda

我的功能GetThing如下:

auto GetThing(size_t index, auto&& l1)
{
    return l1;
}
auto GetThing(size_t index, auto&& l1, auto&&... rest)
{
    if (index == 0)
        return l1;
    return GetThing(index - 1, rest...);
}
Run Code Online (Sandbox Code Playgroud)

我希望它也能够处理int不同的 lambda,同时能够处理其他类型(意味着非 lambda、非函数,如和 ...),例如

std::cout << GetThing(1, 2, 3, 4);   //works, return 3
std::cout << GetThing(1, [] {return 0; }, 
    [] {return 1; }, [] {return 2; }, 
    [] {return 3; } )();             //nope
Run Code Online (Sandbox Code Playgroud)

但是这里的问题是 lambdas 是不同的类型,因此递归函数会推导出不兼容的返回类型,所以我似乎必须这样使用std::function,但它很难看。

std::cout << GetThing(1, …
Run Code Online (Sandbox Code Playgroud)

c++ c++20

7
推荐指数
1
解决办法
319
查看次数

带维数的多维数组模板

我想制作一个NDArray具有固定尺寸的模板,但可以在每个尺寸上调整大小。

我的问题是如何让它能够根据使用了多少对来推断构造函数中的尺寸{}?构造函数中的元素将用于初始化一些元素。

#include <array>
#include <iostream>

template<typename T, size_t Dimension>
class NDArray
{
    T* buffer = nullptr; //flattened buffer for cache locality
    std::array<size_t, Dimension> dimension;    //keep the current sizes of each dimension
public:
    NDArray(std::initializer_list<T> elements) : dimension{elements.size()}   //for 1D
    {
        std::cout << "Dimension = " << Dimension << '\n';
    }
    NDArray(std::initializer_list<NDArray<T, Dimension-1>> list) //how to make this works???
    {
        std::cout << "Dimension = " << Dimension << '\n';
    }
};

template<typename T, size_t N>
NDArray(const T(&)[N]) …
Run Code Online (Sandbox Code Playgroud)

c++ templates multidimensional-array c++17 deduction-guide

6
推荐指数
1
解决办法
161
查看次数

将 boost::json 静态库与 cmake 一起使用

我有这个CMakeLists.txt

set(Boost_USE_STATIC_LIBS   ON)
find_package(Boost REQUIRED COMPONENTS json)
include_directories(${BOOST_INCLUDE_DIRS})
target_link_libraries(<Target> PRIVATE Boost::json)
Run Code Online (Sandbox Code Playgroud)

但我收到 cmake 警告

[cmake] CMake Warning at C:/Program Files/CMake/share/cmake3.20/Modules/FindBoost.cmake:2185 (message):
[cmake]   No header defined for json; skipping header check (note: header-only
[cmake]   libraries have no designated component)
Run Code Online (Sandbox Code Playgroud)

该项目可以配置和构建。~~但是compile_command.json我发现实际上并没有链接到静态库,这清楚地表明它没有找到并且被编译为仅标头库。~~

编辑:我发现它实际上链接到libboost_json-mt.a生成的build.ninja文件中,所以奇怪的是 cmake 在调用中找不到静态库find_package

build MyTest.exe MyTest[1]_tests.cmake: CXX_EXECUTABLE_LINKER__MyTest_Debug CMakeFiles/MyTest.dir/test.cpp.obj CMakeFiles/MyTest.dir/BasicStructures/Uri.cpp.obj | C$:/msys64/mingw64/lib/libgtest_main.dll.a C$:/msys64/mingw64/lib/libboost_json-mt.a C$:/msys64/mingw64/lib/libgtest.dll.a C$:/msys64/mingw64/lib/libboost_container-mt.a
  FLAGS = -g
  LINK_LIBRARIES = C:/msys64/mingw64/lib/libgtest_main.dll.a  C:/msys64/mingw64/lib/libboost_json-mt.a  C:/msys64/mingw64/lib/libgtest.dll.a  C:/msys64/mingw64/lib/libboost_container-mt.a  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 …
Run Code Online (Sandbox Code Playgroud)

c++ boost cmake

6
推荐指数
1
解决办法
3940
查看次数

std::reduce 与函子

我尝试使用std::reduce函子来计算数组中的字符数。GCC 在 MSVC 中编译和工作时出错。链接在这里

#include <iostream>
#include <array>
#include <numeric>
#include <cstring>

int main()
{
    std::array arr{ "Mickey","Minnie","Jerry" };
    struct StringLength
    {
        auto operator()(const char* l, size_t r)
        {
            return strlen(l) + r;
        }
        auto operator()(size_t l, const char* r)
        {
            return l + strlen(r);
        }
        auto operator()(const char* l, const char* r)
        {
            return strlen(l) + strlen(r);
        }
        auto operator()(size_t l, size_t r)
        {
            return l + r;
        }
    };
    std::cout << std::reduce(arr.begin(), arr.end(), size_t{}, StringLength()); …
Run Code Online (Sandbox Code Playgroud)

c++ libstdc++

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

OpenCL Nvidia GPU 上的小常量内存大小

我有以下矩阵乘法代码,为简单起见缩写。我计划使用block_size*block_size用于保存子矩阵块的本地内存。我不断收到错误代码-52clEnqueueNDRangeKernel,当我在NVIDIA GPU上运行它。经过一番研究,我发现 NVIDIA gpu 上的恒定内存大小非常小。

主持人:

    cl::Buffer a_buf{ context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, a.bytes(), a.data };
    cl::Buffer b_buf{ context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, a.bytes(), bT.data };
    cl::Buffer result_buf{ context, CL_MEM_READ_WRITE , result.bytes(), nullptr }; //for memory mapping
    kernel.setArg(0, a_buf);
    kernel.setArg(1, b_buf);
    kernel.setArg(2, local_size*local_size* sizeof(float), nullptr);
    kernel.setArg(3, local_size*local_size* sizeof(float), nullptr);
    kernel.setArg(4, result_buf);
    queue.enqueueNDRangeKernel(kernel, { 0,0 }, { a.rows, a.rows }, {local_size, local_size});
                                        //  ^ offset   ^global work size  ^local work size
Run Code Online (Sandbox Code Playgroud)

核心:

__kernel void matrixMul(__constant float* a, …
Run Code Online (Sandbox Code Playgroud)

opencl

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

std::basic_string 作为函数模板的参数不能从 const char* 推导出来

为什么std::basic_string作为函数模板的参数 put 会推演失败const char*,而直接构造却可以推演成功?

#include <string>
#include <iostream>
template<class Char/*, class Traits, class Allocator*/>   
                      //^doesn't matter whether the second and third template parameter is specified
void printString(std::basic_string<Char/*, Traits, Allocator*/> s)
{
    std::cout << s;
}
int main()
{
    printString("hello");    //nope
    std::basic_string s{ "hello" };//works
}
Run Code Online (Sandbox Code Playgroud)

我在这里找到了相关帖子,但答案没有解释背后的原因

c++ templates implicit-conversion template-argument-deduction

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

使用 gcc 在 cmake 中设置堆栈大小

我正在使用gcc 9.2cmake 3.15在 Linux 上构建 C++ 项目,并且需要增加默认堆栈大小。我之前找到了很多答案,但似乎都不起作用

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,--stack,1000000")
message(${CMAKE_CXX_COMPILER_ID})
message(${CMAKE_EXE_LINKER_FLAGS})
Run Code Online (Sandbox Code Playgroud)

它给出了一个错误:

/usr/bin/ld: unrecognized option '--stack'
/usr/bin/ld: use the --help option for usage information
Run Code Online (Sandbox Code Playgroud)

我可以看到参数确实是在 cmake 输出中传递的:

GNU
-Wl,--stack,1000000
Run Code Online (Sandbox Code Playgroud)

而下面这个标志似乎根本不存在。

set(CMAKE_CXX_STACK_SIZE 1000000)
Run Code Online (Sandbox Code Playgroud)

linker gcc g++ cmake

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

glm::lookAt 给出了 2D 轴的意外结果

基本上我有一个局部空间,其中 y 指向下方,x 指向右侧,就像

       |
       |
  ---------> +x
       |
       | +y
Run Code Online (Sandbox Code Playgroud)

中心位于 (320, 240),因此左上角为 (0,0)。一些窗口系统使用它。

所以我有这个代码

       |
       |
  ---------> +x
       |
       | +y
Run Code Online (Sandbox Code Playgroud)

我想我需要从 z 的负位置朝正 z 方向查看 (320,240,0),“向上”方向是负 y。

但它似乎没有提供正确的结果

    auto const proj = glm::ortho(0.0f, 640.0f, 0.0f, 480.0f);
    auto const view = glm::lookAt(
        glm::vec3(320.0f, 240.0f, -1.0f),   //eye position
        glm::vec3(320.0f, 240.0f, 0.0f),    //center
        glm::vec3(0.0f, -1.0f, 0.0f)        //up
    );
Run Code Online (Sandbox Code Playgroud)

c++ opengl game-development glm-math

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

AVX2 simd 在更高的优化级别上的性能比标量差

我正在学习和玩 SIMD 函数并编写了一个简单的程序,将它可以在1 秒内运行的向量加法指令的数量与普通标量加法进行比较。我发现 SIMD 在较低的优化级别上表现相对更好,而在较高的优化级别上表现得更差,我想知道我同时使用 MSVC 和 gcc的原因,这是同一个故事。以下结果来自Ryzen 7 CPU。我还在英特尔平台上进行了测试,也几乎是一样的故事。

#include <iostream>
#include <numeric>
#include <chrono>
#include <iterator>
#include <thread>
#include <atomic>
#include <vector>
#include <immintrin.h>
int main()
{
    const auto threadLimit = std::thread::hardware_concurrency() - 1; //for running main() 
    for (auto i = 1; i <= threadLimit; ++i)
    {
        std::cerr << "Testing " << i << " threads: ";
        std::atomic<unsigned long long> sumScalar {};
        std::atomic<unsigned long long> loopScalar {};
        std::atomic<unsigned …
Run Code Online (Sandbox Code Playgroud)

c++ performance gcc simd avx2

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