小编ein*_*ica的帖子

nVidia RDMA GPUDirect是否始终仅运行物理地址(在CPU的物理地址空间中)?

我们知道:http://en.wikipedia.org/wiki/IOMMU#Advantages

IOMMU可以支持外围存储器分页.使用PCI-SIG PCIe地址转换服务(ATS)页面请求接口(PRI)扩展的外设可以检测并发出对内存管理器服务的需求.

在此输入图像描述

但是当我们使用CUDA> = 5.0的nVidia GPU时,我们可以使用RDMA GPUDirect,并且知道:

http://docs.nvidia.com/cuda/gpudirect-rdma/index.html#how-gpudirect-rdma-works

传统上,使用CPU的MMU作为内存映射I/O(MMIO)地址,将BAR窗口等资源映射到用户或内核地址空间.但是,由于当前的操作系统没有足够的机制来在驱动程序之间交换MMIO区域,因此NVIDIA内核驱动程序会导出函数以执行必要的地址转换和映射.

http://docs.nvidia.com/cuda/gpudirect-rdma/index.html#supported-systems

从PCI设备的角度来看,GPUDirect的RDMA当前依赖于所有物理地址是相同的.这使它与IOMMU不兼容,因此必须禁用它们才能使RDUD for GPUDirect正常工作.

如果我们将CPU-RAM分配并映射到UVA,如下所示:

#include <iostream>
#include "cuda_runtime.h"
#include "device_launch_parameters.h"

int main() {
    // Can Host map memory
    cudaSetDeviceFlags(cudaDeviceMapHost);  

    // Allocate memory
    unsigned char *host_src_ptr = NULL;
    cudaHostAlloc(&host_src_ptr, 1024*1024, cudaHostAllocMapped);
    std::cout << "host_src_ptr = " << (size_t)host_src_ptr << std::endl;

    // Get UVA-pointer
    unsigned int *uva_src_ptr = NULL;
    cudaHostGetDevicePointer(&uva_src_ptr, host_src_ptr, 0);
    std::cout << "uva_src_ptr  = " << (size_t)uva_src_ptr << std::endl;

    int b; …
Run Code Online (Sandbox Code Playgroud)

cuda gpgpu memory-mapping pci-e gpudirect

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

是否有一个与Visual Studio C++编译器等效的-ffast-math标志

我正在使用带有标志/Ox(完全优化)的Visual Studio 2013附带的默认C++编译器(我猜它称为"Visual Studio C++编译器" ).由于浮点副作用,我必须-ffast-math在使用gcc编译器时禁用该标志.在Visual Studio C++编译器的配置中是否存在此标志的等效选项?

gcc compiler-optimization visual-studio-2013 fast-math

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

可以/我应该使用std :: exception来进行常规错误处理吗?

我将用C++开始这个新项目,并且正在考虑一种不痛苦的错误处理方法.现在,我不打算开始抛出和捕获异常,并且很可能永远不会抛出异常,但我在想 - 即使是常规错误处理,为什么要自己滚动/复制粘贴一个类来描述错误/状态,当我可以使用std::exception它的子类(或者也许是一个std::optional<std::exception>)?

using Status = std::optional<std::exception>;
Status somethingThatMayFail(int x);
Run Code Online (Sandbox Code Playgroud)

有人/任何项目是这样工作的吗?这是一个荒谬的想法还是有点吱吱作响?

c++ error-handling idioms idiomatic

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

使用 CMake 安装 ExternalProject

我的其中一个中有以下代码CMakeLists.txt

FIND_PACKAGE(sphinxbase)
if (${SPHINXBASE_FOUND})
    INCLUDE_DIRECTORIES(${SPHINXBASE_INCLUDE_DIR}/sphinxbase/)
else ()
    ExternalProject_Add(
        sphinxbase
        GIT_REPOSITORY      "https://github.com/cmusphinx/sphinxbase.git"
        GIT_TAG             "e34b1c632392276101ed16e8a05862e43f038a7c"
        SOURCE_DIR          ${CMAKE_CURRENT_SOURCE_DIR}/lib/sphinxbase
        CONFIGURE_COMMAND   ${CMAKE_CURRENT_SOURCE_DIR}/lib/sphinxbase/autogen.sh
        BUILD_COMMAND       ${MAKE}
        UPDATE_COMMAND      ""
        INSTALL_COMMAND     ""
        BUILD_IN_SOURCE     ON
        LOG_DOWNLOAD        ON
        LOG_UPDATE          ON
        LOG_CONFIGURE       ON
        LOG_BUILD           ON
        LOG_TEST            ON
        LOG_INSTALL         ON
    )
    ExternalProject_Get_Property(sphinxbase SOURCE_DIR)
    ExternalProject_Get_Property(sphinxbase BINARY_DIR)
    SET(SPHINXBASE_SOURCE_DIR ${SOURCE_DIR})
    SET(SPHINXBASE_BINARY_DIR ${BINARY_DIR})
    SET(SPHINXBASE_LIBRARIES ${SPHINXBASE_BINARY_DIR}/src/libsphinxbase/.libs/libsphinxbase.a)
    INCLUDE_DIRECTORIES(${SPHINXBASE_SOURCE_DIR}/include)
endif ()
SET(DEPENDENCIES ${DEPENDENCIES} sphinxbase)
SET(LIBS ${LIBS} ${SPHINXBASE_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

除了我要安装的 TARGET 之外,我将如何安装这个 ExternalProject?现在我正在尝试这样做:

install(TARGETS ${LIBS}
        LIBRARY DESTINATION lib
        ARCHIVE DESTINATION lib
        OPTIONAL
        )

install(TARGETS ${PROJECT_NAME}
        RUNTIME DESTINATION bin
        )
Run Code Online (Sandbox Code Playgroud)

但是我收到了以下错误: …

installation build-process build cmake external-project

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

使用gsl :: span和range-v3

我尝试了一个小例子来熟悉GSL和range-v3库,我想知道它们如何协同工作.我有这个玩具的例子

#include <iostream>
#include <range/v3/all.hpp>

using namespace std;
using namespace ranges;

void example_vector(vector<int> const& v)
{
  ranges::for_each(view::tail(v), [](int x){
    cout << x << ' ';
  });
  cout << '\n';
}

int main()
{
   auto seq = vector<int> { 2,2,2,0,0,2,1,2 };
   example_vector(seq);
}
Run Code Online (Sandbox Code Playgroud)

哪个有效.但是,如果我尝试使用gsl::span<int>范围,则会导致错误消息.编译器告诉我span没有满足视图概念.

#include <gsl.h>

// ...

void example_span(gsl::span<const int> v)
{
  ranges::for_each(view::tail(v), [](int x){
    cout << x << ' ';
  });
  cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)

编译器消息:

note: candidate template ignored: disabled by 'enable_if'
      [with Rng …
Run Code Online (Sandbox Code Playgroud)

c++ range-v3 guideline-support-library

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

获取字符串流中的最后一个字符而不复制其整个缓冲区

如果我使用此代码:

template <typename Streamable>
/* ... */
std::stringstream ss;
ss << function_yielding_a_Streamable();
auto last_char = ss.str().back();
Run Code Online (Sandbox Code Playgroud)

然后(我相信)ss需要创建一个缓冲区中的字符串副本,只为我获取最后一个字符,然后它将被销毁.我可以做一些更好的事情吗?也许使用这种seekp()方法?

c++ string stringstream seek

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

我真的需要向朋友操作符<<向后弯曲吗?对于命名空间中的类?

我想实现一个运算符<< for streaming my class(比如说它的名字Paragraph).类Paragraph有一些私有数据,因此我希望(独立)运算符<<函数成为朋友.所以,我按照建议做,例如,在这里.friend声明,实施operator<<和一切都很好.

但是现在我想将Paragraph放在命名空间中namespace foo.它不再有效!如果我写:

namespace foo {
class Paragraph {
    public:
        explicit Paragraph(std::string const& init) :m_para(init) {}
        std::string const&  to_str() const { return m_para; }
    private:
        friend std::ostream & operator<<(std::ostream &os, const Paragraph& p);
        std::string     m_para;
};
} // namespace foo
Run Code Online (Sandbox Code Playgroud)

编译器告诉我,我已成为朋友foo::operator<<,而不是::operator<<.好,可以.所以,我用以下内容替换了朋友行:

    friend std::ostream & ::operator<<(std::ostream &os, const Paragraph& p);
Run Code Online (Sandbox Code Playgroud)

但我再次收到错误(来自GCC 5.4.0),告诉我::operator<<尚未宣布.好的,我们先声明吧.这有用吗?:

namespace foo {
std::ostream & ::operator<<(std::ostream &os, …
Run Code Online (Sandbox Code Playgroud)

c++ encapsulation private friend

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

是否有一种可移植/符合标准的方法来获取堆栈跟踪中的文件名和行号?

我刚读完

当我的 gcc C++ 应用程序崩溃时如何生成堆栈跟踪

现在已经很老了(5年)。一些答案提出了解决方案,允许您为每个堆栈帧获取函数的名称和偏移量(我猜是在堆栈内)。但是我(可能还有其他人)真正需要的是进行调用的源文件名和行号(假设代码是用调试信息编译的)。链接到执行此操作的 glibc 的一部分的答案之一(libSegfault;请参阅此目录中的文件- segfault.c, backtracesyms.c, backtracesymsfd.c) - 所以它是可能的

我的问题是:

  • 可以以独立于平台的方式提取此信息,还是可以符合某种标准(POSIX??)
  • 为什么 libunwind 不支持这个?(我认为没有,在浏览了他们的网站后
  • 这是否一定取决于您的编译器的 C/C++ 标准库(至少对于 C/C++ 应用程序)?

笔记:

  • 你可以假设二进制文件有调试信息,所以在 C/C++ 的情况下,它是用-g; 当然,在适当的库中,我们会检查调试信息是否可用。

c c++ glibc stack-trace libunwind

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

我可以将doxygen解析为@ ref到C++标准库函数吗?

我有时想在我的doxygen评论中提到标准库构造.我可以使用HTML <a>元素执行此操作- 但这是要粘贴的大量文本.我宁愿能简单地写{@ref std::string},并有doxygen的知道它需要链接到cppreference.org 页面std::string.

我想也许如果有人要为标准库生成一个doxygen标签文件(如果标签文件不支持任意URL,那么这可能不起作用)也许是可能的.那么,还有另一种方法吗?

c++ doxygen code-documentation

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

管理复杂的存储库结构 - 模块依赖关系和共享代码

(以下是我在组织我正在处理的源代码时所遇到的各种复杂性的"理论MCVE".你可以将它视为一个具体的问题而且会很好,或者你可以参考它提出的一般问题并建议如何解决它们.)

假设我有代码A,B,C和D的模块.A取决于B,C,D; B取决于C; C,D不依赖于其他模块.(我松散地使用术语"模块",所以请不要在这里挑剔).

另外,在A,B,C,D的所有部分中,使用了一些相同的头文件,甚至可能是编译对象,将它们组合在一起形成第五个模块是没有意义的,因为它太小了没用 让我们foo.h成为该类别中的一个文件.

虽然所有这些模块都保存在单个整体代码库中,但一切都很好.一切都是一个副本; 在使用相同功能编译的对象之间没有链接器冲突.

在此输入图像描述

问题是:如何将B,C,D中的每一个都放入版本管理的存储库中,以便:

  • 它们中的每一个都可以仅依赖于它所依赖的模块(作为子模块/子存储库或其他方式)来构建; 和
  • 我不需要确保并手动维护/更新相同文件的单独版本,或者从一个库到下一个库进行结转提交(除了可能更改指向的修订版); 和
  • 当所有内容一起构建时(即构建A时),构建不涉及foo.hC的双重副本和C的双重副本(一次用于A,一次用于B) - 我可能总是要确保并保持完全同步.

请注意,当我有更多的时间我会编辑它以使问题更具体(即使我有点像广泛的问题).我会说,在我的具体情况下,代码是现代C++,CUDA,一些bash脚本和CMake模块.因此,面向Java的解决方案是行不通的.

version-control mercurial directory-structure subrepos mercurial-subrepos

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