与barrier()(我认为我理解)不同,mem_fence()不会影响工作组中的所有项目.OpenCL规范说(第6.11.10节),用于mem_fence():
订单执行内核的工作项的加载和存储.
(因此它适用于单个工作项).
但是,与此同时,在第3.3.1节中,它说:
在工作项内存中具有加载/存储一致性.
所以在工作项中内存是一致的.
那么什么样的东西mem_fence()有用呢?它不适用于项目,但在项目中不需要......
请注意,我没有使用原子操作(第9.5节等).mem_fence()与这些想法一起使用的想法是什么?如果是这样,我很乐意看到一个例子.
谢谢.
更新:我可以看到使用时,它是如何有效使用 barrier()(隐式,由于阻挡调用mem_fence()) -但肯定必须有更多,因为它单独存在?
注意:此问题特定于nVIDIA Compute Capability 2.1设备.以下信息可从CUDA编程指南v4.1获得:
在计算能力2.1设备中,每个SM具有48个SP(核心),用于整数和浮点运算.每个warp由32个连续的线程组成.每个SM都有2个warp调度程序.在每个指令发布时,一个warp调度程序选择一个准备好的线程warp并发出2个内核上的warp 指令.
我的疑惑:
我有以下结构的代码(实际上当然要复杂得多,特别是"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或C++编译器时,如果我们通过-O3交换机,执行会变得更快.在CUDA中,有没有相同的东西?
我正在使用该命令编译我的代码nvcc filename.cu.之后我执行./a.out.
如果我的项目有一堆测试,我可以运行它们 - 在cmakeing 和makeing 构建、构建之后 - 使用make test.
但是,如果我只想运行其中一项测试怎么办?也就是说,我add_test()在测试中拥有的项目之一CMakeFile.txt?
以下代码应该编译吗?
#include <type_traits>
void foo() {
const std::pair<int, int> x = {1, 2};
auto [a, b] = x;
static_assert(std::is_const_v<decltype(a)>);
static_assert(std::is_const_v<decltype(b)>);
}
Run Code Online (Sandbox Code Playgroud)
那么,这是MSVC错误吗?
该标准是不是直接在这里(我有一个快速浏览一下),但考虑规则auto,我想,a并且b应该被复制丢弃CV-预选赛。
我听说C ++ 20将支持作用于范围,而不仅仅是begin + end迭代器对。这是否意味着在C ++ 20中,我将能够编写:
std::vector<int> vec = get_vector_from_somewhere();
std::sort(vec);
std::vector<float> halves;
halves.reserve(vec.size());
std::transform(
vec, std::back_inserter(halves),
[](int x) { return x * 0.5; }
);
Run Code Online (Sandbox Code Playgroud)
?
范围将随着 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 库一起编译,这是值得的。
当我尝试启动我的 CLion IDE(或另一个 JetBrains IDE,如 PyCharm、IntelliJ IDEA 等)时,它失败了,我在控制台上收到以下消息:
IDE has not been initialized yet
Run Code Online (Sandbox Code Playgroud)
(在通常的 JVM 警告之后,我总是收到并且并没有阻止 IDE 启动。)
为什么会这样?我该怎么办?
笔记:
当使用 CMake 构建我的项目时,我希望它静态链接到库(如果可用)。现在,.dll.a无论文件是否存在,它都会查找.a文件。
例如,在一个小示例项目中链接到 libpng:
cmake_minimum_required(VERSION 3.15)
project(Test)
add_executable(Test main.cpp)
find_package(PNG REQUIRED)
message(${PNG_LIBRARIES})
target_link_libraries(Test PRIVATE ${PNG_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)
对于message,它输出
C:/msys64/mingw64/lib/libpng.dll.aC:/msys64/mingw64/lib/libz.dll.a
但libpng.a和libz.a文件也可以在同一目录中使用。我如何告诉 CMake 链接.a文件?
我在 Windows 10 上使用 MinGW-w64 和 msys64,但更喜欢跨平台的解决方案。