我编写了一个简单的多线程程序,如下所示:
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中或-O0
在GC c和后打印出的结果1
秒钟。但是它卡住了,在“ 释放”模式或中不打印任何内容-O1 -O2 -O3
。
我的功能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) 我想制作一个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) 我有这个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) 我尝试使用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) 我有以下矩阵乘法代码,为简单起见缩写。我计划使用block_size*block_size
用于保存子矩阵块的本地内存。我不断收到错误代码-52
中clEnqueueNDRangeKernel
,当我在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) 为什么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
我正在使用gcc 9.2和cmake 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) 基本上我有一个局部空间,其中 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) 我正在学习和玩 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)