小编ein*_*ica的帖子

如何选择哪个CMake可执行目标是默认目标?

我写了一个CMakeLists.txt包含2个可执行文件(target1target2)的文件:

ADD_EXECUTABLE(target1 ${CXX_FILES})
TARGET_LINK_LIBRARIES(target1 ${requiredlibs})

ADD_EXECUTABLE(target2 ${CXX_FILES} ${OTHER_CXX_FILES})
TARGET_LINK_LIBRARIES(target2 ${requiredlibs})
Run Code Online (Sandbox Code Playgroud)

现在,每当我在没有任何参数的情况下运行make时,都会重建两个目标.但我想定义target1为默认可执行文件,以便只运行make而不使用任何参数target1.对于建筑target2我会跑make target2.

这可能吗?

在CMake创建的Makefile中,有以下定义:default_target:all

我想我需要一种方法来此设置default_targettarget1.

我遇到的另一个问题是make总是重建目标,即使没有更改源文件.

build cmake

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

对齐图像卷积(OpenCL/CUDA)内核的GPU内存访问

为了理解如何确保对齐要求得到满足,我多次阅读以下文章,从OpenCL p.no:157中的异构计算一书.这显示了如何为图像卷积中的问题填充填充(假设工作组大小为16 x 16).

对齐记忆访问

NVIDIA和AMD GPU的性能均受益于全局内存中的数据对齐.特别是对于NVIDIA,在128字节边界上对齐访问和访问128字节段将理想地映射到存储器硬件.但是,在这个例子中,16宽工作组将只访问64字节段,因此数据应该对齐到64字节的地址.这意味着每个工作组访问的第一列应该从64字节对齐的地址开始.在此示例中,使边框像素不生成值的选择确定所有工作组的偏移量将是工作组维度的倍数(即,对于16 x 16工作组,工作组将开始访问列N*16处的数据) .为确保每个工作组正确对齐,

1 - 任何人都可以帮助我理解填充每个工作组访问的第一列后是如何从64字节对齐的地址开始的(上述段落中提到的要求,对吧?)?

2 - 该图也是正确的声明:对于16 x 16工作组,工作组将开始访问N*16列的数据.

如果正确,图中所示的工作组1,2应该开始访问第1x16列的数据,这与图中所示的相反.我完全糊涂了!! :(

更新: Q-2现在对我来说很清楚. 实际上图中显示的工作组是2,1(在opencl惯例中,第一列),所以它完全正确:2x16 = 32而不是我想的1x16.

但问题不是.1仍然没有答案.

在此输入图像描述

cuda gpgpu memory-alignment opencl gpu-programming

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

如何在C++中实现生成器?

我想知道如何在C++中实现像Python这样的生成器?Python可以使用关键字"yield"来执行此操作.但是如何在C++中实现呢?

c++ idioms generator

11
推荐指数
4
解决办法
5123
查看次数

boost :: system ::(...)_ category定义但未使用

我目前正在收到编译器警告,类似于我在问题标题中给出的警告.警告如......

warning: 'boost::system::generic_category' defined but not used

warning: 'boost::system::posix_category' defined but not used

warning: 'boost::system::errno_ecat' defined but not used

warning: 'boost::system::native_ecat' defined but not used

据我所知,该计划不受任何影响.但是,我不喜欢挂着警告,但我不知道这些警告试图告诉我什么,除了那些定义和与boost相关的东西悬挂在某个没有被使用的地方.但是,我已经定义过的所有东西,我已经习惯了.我正在使用的boost库是随机库和文件系统库.

当我检查警告的来源时,它会调出Boost的error_category.hpp文件并突出显示一些static const被注释为"预定义错误类别"或"已弃用的同义词"的文件.也许这个问题与我在使用库时的错误处理(或缺少)有关?

任何人都可以对这些警告突然出现的原因有所了解吗?我完全错过了什么吗?

PS警告是最高级别.

c++ boost compiler-warnings unused-variables

11
推荐指数
2
解决办法
7157
查看次数

gcc,simd内在函数和快速数学概念

大家好:)
我试图抓住一些关于浮点,SIMD /数学内在函数和gcc的快速数学标志的概念.更具体地说,我在x86 cpu上使用MinGW和gcc v4.5.0.

我现在已经搜索了一会儿,这就是我(我想)我现在所理解的:

当我没有标志编译时,任何fp代码将是标准x87,没有simd内在函数,math.h函数将从msvcrt.dll链接.

当我使用mfpmath,mssen和/或march使得mmx/sse/avx代码被启用时,gcc实际上只有在我还指定一些优化标志时才使用simd指令,如Onftree-vectorize.在这种情况下,内部函数是由gcc自动选择的,并且一些数学函数(我仍在谈论math.h上的标准数学函数)将成为内在函数或通过内联代码进行优化,其他函数仍将来自msvcrt. DLL.如果我没有指定优化标志,这会改变吗?

当我使用特定的simd数据类型(那些可用作gcc扩展,如v4siv8qi)时,我可以选择直接调用内部函数,或者再次将自动决定留给gcc.如果我没有通过正确的标志启用simd指令,Gcc仍然可以选择标准的x87代码.同样,如果我没有指定优化标志,这会改变吗?

如果我的任何陈述错误,请纠正我:p

现在的问题是:

  1. 我是否必须包含x86intrin.h才能使用内在函数?
  2. 我是否必须链接libm?
  3. 什么快速数学与任何东西有关?我理解它放宽了IEEE标准,但具体来说,如何?使用其他标准功能?其他一些lib链接?或者只是在某处设置了几个标志,标准的lib表现不同?

感谢任何想要帮助的人:D

gcc simd intrinsics fast-math

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

在OpenCL中,mem_fence()做什么,而不是barrier()?

barrier()(我认为我理解)不同,mem_fence()不会影响工作组中的所有项目.OpenCL规范说(第6.11.10节),用于mem_fence():

订单执行内核的工作项的加载和存储.

(因此它适用于单个工作项).

但是,与此同时,在第3.3.1节中,它说:

在工作项内存中具有加载/存储一致性.

所以工作项中内存是一致的.

那么什么样的东西mem_fence()有用呢?它不适用于项目,但在项目中不需要......

请注意,我没有使用原子操作(第9.5节等).mem_fence()与这些想法一起使用的想法是什么?如果是这样,我很乐意看到一个例子.

谢谢.

规格,供参考.

更新:我可以看到使用时,它是如何有效使用 barrier()(隐式,由于阻挡调用mem_fence()) -但肯定必须有更多,因为它单独存在?

gpgpu memory-fences opencl memory-barriers barrier

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

nVIDIA CC 2.1 GPU warp调度程序如何一次发出2条指令进行扭曲?

注意:此问题特定于nVIDIA Compute Capability 2.1设备.以下信息可从CUDA编程指南v4.1获得:

在计算能力2.1设备中,每个SM具有48个SP(核心),用于整数和浮点运算.每个warp由32个连续的线程组成.每个SM都有2个warp调度程序.在每个指令发布时,一个warp调度程序选择一个准备好的线程warp并发出2个内核上的warp 指令.

我的疑惑:

  • 一个线程将在一个核心上执行.如何在单个时钟周期或单个多周期操作中向线程发出2条指令?
  • 这是否意味着2条指令应该相互独立?
  • 2个指令可以在核心上并行执行,也许是因为它们在核心中使用不同的执行单元?这是否也意味着只有在2条指令完成执行后或者在其中一条指令执行完之后,warp才会准备就绪?

cuda gpu gpu-warp

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

'using'语句使用g ++编译,无法使用clang进行编译

我有以下结构的代码(实际上当然要复杂得多,特别是"Base"是一个三线程,但我试图捕捉它的要点):

template <class T>
class A {};

template <class T>
class B {
public:
    B(){};
};

template <class T>
class C : public B<A<T>> {
public:
    using Base = B<A<T>>;
    using Base::B;
};

static const C<int> c{};
Run Code Online (Sandbox Code Playgroud)

代码用g ++编译好

g++ -c test.cpp -std=c++11
Run Code Online (Sandbox Code Playgroud)

但是,使用clang ++我收到一条错误消息,我真的不明白

clang++ -c test.cpp -std=c++11
Run Code Online (Sandbox Code Playgroud)

test.cpp:14:14:错误:依赖使用声明解析为使用Base :: B键入不带'typename';

我的代码有什么问题或者这是clang中的错误吗?

注意:在编写using B<A<T>>::B;它时,编译器编译很好,但这不是我的问题的真正解决方案.

编辑:clang版本是3.5.0,gcc版本是4.9.2

c++ compilation g++ clang

11
推荐指数
2
解决办法
950
查看次数

std :: numeric_limits :: quiet_NaN()与std :: nan()vs. NAN

我很惊讶表示安静的NaN值的C++工具的数量.我发现了三种标准方式:

  1. std::numeric_limits<T>::quiet_NaN() - 通用,我认为这是被选中的
  2. std::nan,std::nanf,std::nanl-家庭的接收功能const char*参数
  3. NAN - 一个宏,"评估为一个安静的非数字"

其中每一个都是在C++ 11中引入的.我有几个问题:

  1. const char*争论代表什么std::nan和合作?如何使用?
  2. 为什么我们需要在C++ 11中添加,而我们已经为此目的添加了一个通用特征类?(是否与C兼容?)
  3. 我应该默认使用的是什么?(我想这是第一次)

floating-point nan cmath c++11

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

我们能用 C++20 构造带有视图的容器吗?

范围将随着 C++20 标准版本进入 C++。

我的问题:我们是否能够构建(现有)任何范围的标准库容器?更重要的是,具有范围视图?

例如,这会不会:

#include <vector>
#include <iostream>
#include <ranges>

int main() {
    auto sq = [](int x) { return x * x; };
    std::vector<int> vec { 3, 4, 5 };
    std::vector<int> squares { std::ranges::views::transform(vec, sq) };
    for(auto i : squares) { std::cout << i << ' '; }
    std::cout << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

是一个打印的有效程序9 16 25

与 range-v3 库一起编译,这是值得的。

c++ range-v3 c++20

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