C++ 11对原子变量进行了"比较和交换"操作.
语义是:
原子比较值指向
obj与所述值所指向的expected,并且如果这些都是相等,取代了以前使用desired(执行读-修改-写操作).否则,加载实际值所指向的obj进入*expected(进行负载操作).
我想做同样的事情,但不是*obj在值相等时设置,而是希望在一个大于另一个时设置它(假设我们正在谈论一个有序类型).
这是以某种方式支持的吗?也许可以通过一些黑客实现?
注意: CAS循环不适用于我,因为我正在比较的两个值可能在非原子操作之间发生变化.
我想在我的OpenCL内核中创建一个本地数组,其大小取决于内核的参数.似乎不允许 - 至少在AMD APP上.
你的经历与众不同吗?也许它只是APP?或者这里有一些理由吗?
编辑:我现在建议在CPU端代码中也应该允许变长数组,这是C标准委员会的一个不幸的调用; 但问题是.
我正在为目标平台编写代码NO C-runtime.No stdlib,no stdio.我需要一个字符串格式化函数,snprintf但应该是able to run without any dependencies,甚至不是C库.
最多可能取决于memory alloc functions我提供的.
我检查了Trio但它需要stdio.h header.我不能用这个.
编辑
目标平台:( PowerPC64 home made OS不是我).但是,库不应该依赖于OS特定的东西.
EDIT2
我尝试过一些第三方开源库,比如Trio(http://daniel.haxx.se/projects/trio/),snprintf和miniformat(https://bitbucket.org/jj1/miniformat/src)但是所有这些都依赖于像string.h,stdio.h或者(甚至更糟糕的)stdlib.h这样的头文件.如果已经存在,我不想编写自己的实现,因为这会耗费时间并且容易出错.
我们知道: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) 我正在开发一个用CMake构建的项目,所以我正在CMakeLists.txt为它编写一个.在这个文件中,我想要一个(缓存的)CMake变量,它只能采用几个选项之一(我会以某种方式指定),而不是任意字符串.为简单起见,让我们把它变成一个可以采用"红色","绿色"或"蓝色"的字符串 - 但没有别的.
我可以使用最近的CMake版本来实现这一点,除了设置任意字符串然后检查其有效性吗?
我正在使用 valgrind 尝试查找 C-cum-C++ 程序中内存访问违规的原因。即使避免了这种访问(即当一切运行正常时),valgrind 告诉我:
==11436== Memcheck, a memory error detector
==11436== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==11436== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==11436== Command: bin/monetdb-bp-reader /home/eyalroz/dbfarms/monetdb/tpch-sf-1
==11436==
--11436-- WARNING: Serious error when reading debug info
--11436-- When reading debug info from /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.24:
--11436-- Ignoring non-Dwarf2/3/4 block in .debug_info
--11436-- WARNING: Serious error when reading debug info
--11436-- When reading debug info from /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.24:
--11436-- Last block truncated …Run Code Online (Sandbox Code Playgroud) 我正在写一个库。在我的一个单元测试中,我想创建一个临时文件,进行一些涉及该文件的库调用,并在退出时删除该文件(成功、失败和异常 - 清理很重要!)。
十多年前,有人问:如何在 C++ 中创建临时文本文件?。但是 - 答案要么是不可移植的,要么不是一个正确的完整解决方案(例如,您得到一个文件描述符,但没有明显的方式来获取名称,因此您无法按名称访问文件(std::tmpfile);您得到一个名称( std::tmpnam) 但不能确定它尚未使用;等等。)如果这个问题得到解决,我想我的问题将由围绕其中一些调用的一些 RAII 包装器来回答。但是 - 我关心当前的现实。
我的库必须可与 C++11 一起使用,因此如果可能的话,我更喜欢 C++11 解决方案。使用 Boost 是可以接受的,但不可取。
假设我正在使用一些具有函数的 C 库:
int foo(char* str);
Run Code Online (Sandbox Code Playgroud)
我知道一个事实,即foo()不会修改str. 它只是写得不好,也懒得声明str为常量。
现在,在我的 C++ 代码中,我目前有:
extern "C" int foo(char* str);
Run Code Online (Sandbox Code Playgroud)
我像这样使用它:
foo(const_cast<char*>("Hello world"));
Run Code Online (Sandbox Code Playgroud)
我的问题:原则上,从语言律师的角度来看,在实践中,我这样写是否安全:
extern "C" int foo(const char* str);
Run Code Online (Sandbox Code Playgroud)
并跳过const_cast'ing?
如果没有安全,请解释原因。
注意:我对 C++98 代码的情况特别感兴趣(是的,不幸的是我),所以如果你假设语言标准的更新版本,请这么说。
根据此链接https://docs.nvidia.com/nsight-compute/ProfilingGuide/index.html:
Warp 因等待 MIO(内存输入/输出)指令队列未满而停止。在 MIO 管道(包括特殊数学指令、动态分支以及共享内存指令)的极端利用率的情况下,这种停顿原因很严重。
根据此https://docs.nvidia.com/drive/drive_os_5.1.12.0L/nsight-graphics/activities/index.html:
可能由本地、全局、共享、属性、IPA、索引常量负载 (LDC) 和解耦数学触发。
我的理解是所有内存操作都是在LSU上执行的,所以我会想象它们一起存储在同一个指令队列中,然后由LSU单元执行。由于它们都一起排队,因此第二种解释(包括全局内存访问)对我来说更有意义。问题是,如果是这样的话,LG Throttle 就没有必要了。
MIO Throttle 实际上意味着什么?所有内存指令都存储在同一个队列中吗?
我一直在与飞船操作员一起玩,我想知道以下行为的原因是什么:
struct ArrayWrapper
{
int arr[3];
auto operator<=>(const ArrayWrapper&) const = default;
};
ArrayWrapper a1{1,2,3}, a2{1,2,4};
auto x = a1 <=> a2; // this compiles and works, x is std::strong_ordering::less
Run Code Online (Sandbox Code Playgroud)
数组比较适用于成员数组。它也适用于std::array:
std::array<int, 3> arr1{1,2,4};
std::array<int, 3> arr2{1,2,3};
auto x = arr1 <=> arr2; // x is std::strong_ordering::greater
Run Code Online (Sandbox Code Playgroud)
但是,它不适用于非成员的原始数组:
int rawArr1[3]{1,2,3}, rawArr2[3]{1,2,3};
auto x = rawArr1 <=> rawArr2; // error: invalid operands of types ‘int [3]’ and ‘int [3]’ to binary ‘operator<=>’
Run Code Online (Sandbox Code Playgroud)
我已经在 GCC 11 上测试过了,原因是什么?考虑到它适用于数组成员,这似乎很奇怪。