我们知道: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) 我正在使用带有标志/Ox(完全优化)的Visual Studio 2013附带的默认C++编译器(我猜它称为"Visual Studio C++编译器" ).由于浮点副作用,我必须-ffast-math在使用gcc编译器时禁用该标志.在Visual Studio C++编译器的配置中是否存在此标志的等效选项?
我将用C++开始这个新项目,并且正在考虑一种不痛苦的错误处理方法.现在,我不打算开始抛出和捕获异常,并且很可能永远不会抛出异常,但我在想 - 即使是常规错误处理,为什么要自己滚动/复制粘贴一个类来描述错误/状态,当我可以使用std::exception它的子类(或者也许是一个std::optional<std::exception>)?
using Status = std::optional<std::exception>;
Status somethingThatMayFail(int x);
Run Code Online (Sandbox Code Playgroud)
有人/任何项目是这样工作的吗?这是一个荒谬的想法还是有点吱吱作响?
我的其中一个中有以下代码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)
但是我收到了以下错误: …
我尝试了一个小例子来熟悉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) 如果我使用此代码:
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()方法?
我想实现一个运算符<< 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) 我刚读完
现在已经很老了(5年)。一些答案提出了解决方案,允许您为每个堆栈帧获取函数的名称和偏移量(我猜是在堆栈内)。但是我(可能还有其他人)真正需要的是进行调用的源文件名和行号(假设代码是用调试信息编译的)。链接到执行此操作的 glibc 的一部分的答案之一(libSegfault;请参阅此目录中的文件- segfault.c, backtracesyms.c, backtracesymsfd.c) - 所以它是可能的。
我的问题是:
笔记:
-g; 当然,在适当的库中,我们会检查调试信息是否可用。我有时想在我的doxygen评论中提到标准库构造.我可以使用HTML <a>元素执行此操作- 但这是要粘贴的大量文本.我宁愿能简单地写{@ref std::string},并有doxygen的知道它需要链接到cppreference.org 页面的std::string.
我想也许如果有人要为标准库生成一个doxygen标签文件(如果标签文件不支持任意URL,那么这可能不起作用)也许是可能的.那么,还有另一种方法吗?
(以下是我在组织我正在处理的源代码时所遇到的各种复杂性的"理论MCVE".你可以将它视为一个具体的问题而且会很好,或者你可以参考它提出的一般问题并建议如何解决它们.)
假设我有代码A,B,C和D的模块.A取决于B,C,D; B取决于C; C,D不依赖于其他模块.(我松散地使用术语"模块",所以请不要在这里挑剔).
另外,在A,B,C,D的所有部分中,使用了一些相同的头文件,甚至可能是编译对象,将它们组合在一起形成第五个模块是没有意义的,因为它太小了没用 让我们foo.h成为该类别中的一个文件.
虽然所有这些模块都保存在单个整体代码库中,但一切都很好.一切都是一个副本; 在使用相同功能编译的对象之间没有链接器冲突.
问题是:如何将B,C,D中的每一个都放入版本管理的存储库中,以便:
foo.hC的双重副本和C的双重副本(一次用于A,一次用于B) - 我可能总是要确保并保持完全同步.请注意,当我有更多的时间我会编辑它以使问题更具体(即使我有点像广泛的问题).我会说,在我的具体情况下,代码是现代C++,CUDA,一些bash脚本和CMake模块.因此,面向Java的解决方案是行不通的.
version-control mercurial directory-structure subrepos mercurial-subrepos