Thrust库可用于对数据进行排序.调用可能看起来像这样(带有键和值向量):
thrust::sort_by_key(d_keys.begin(), d_keys.end(), d_values.begin());
Run Code Online (Sandbox Code Playgroud)
称为在CPU上,以d_keys及d_values在CPU存储器是; 并且大部分执行都发生在GPU上.
但是,我的数据已经在GPU上?如何使用Thrust库直接在GPU上执行高效排序,即sort_by_key从内核调用函数?
此外,我的数据包括或者是unsigned long long int或者unsigned int始终是数据的键
unsigned int.我应该如何对这些类型进行推力调用?
Java是否具有C++的默认复制构造函数?如果它有一个 - 如果我明确地声明另一个构造函数(不是复制构造函数),它是否仍然可用?
c++ java language-comparisons copy-constructor object-construction
在C/C++中,我们有__FUNCTION__一个用字符串替换的宏,它保存当前函数的名称.但是,如果我想要函数的标识符怎么办?也就是说,不是字符串,而是我可以用作令牌来创建其他标识符,例如,如果我们有
#define MAGIC /* ... */
#define MORE_MAGIC MAGIC ## _bar
void foo() {
printf("%s\n",__FUNCTION__);
MORE_MAGIC();
}
void foo_bar() {
printf("%s\n",__FUNCTION__);
}
void baz() {
printf("%s\n",__FUNCTION__);
MORE_MAGIC();
}
void baz_bar() {
printf("%s\n",__FUNCTION__);
}
int main() {
foo();
}
Run Code Online (Sandbox Code Playgroud)
应该打印
foo
foo_bar
baz
baz_bar
Run Code Online (Sandbox Code Playgroud)
笔记:
我正在尝试使用boost_1_55_0库,并且我不断遇到对jamfiles的引用.
什么是果酱文件?
为什么有bjam和jamfiles的多个版本?
库基础知识的C++扩展,版本2(N4564)介绍了该类型std::experimental::source_location.
§14.1.2[reflection.src_loc.creation]说:
Run Code Online (Sandbox Code Playgroud)static constexpr source_location current() noexcept;返回:当函数调用(C++14§5.2.2)调用其后缀表达式(可能是带括号的)id-expression命名时
current,返回source_location带有实现定义值的a.该值应受#line(C++14§16.4)影响,其方式与__LINE__和__FILE__.如果以其他方式调用,则返回的值未指定.备注:当使用大括号或等于初始化程序来初始化非静态数据成员时,任何调用都
current应该对应于构造函数的位置或初始化成员的聚合初始化.[ 注意:当用作默认参数(C++14§8.3.6)时,该值
source_location将是current呼叫站点呼叫的位置.- 结束说明 ]
如果我理解正确,那么该功能就像这样使用.
#include <experimental/source_location> // I don't actually have this header
#include <iostream>
#include <string>
#include <utility>
struct my_exception
{
std::string message {};
std::experimental::source_location location {};
my_exception(std::string msg,
std::experimental::source_location loc = std::experimental::source_location::current()) :
message {std::move(msg)},
location {std::move(loc)}
{ …Run Code Online (Sandbox Code Playgroud) 对于作为ptr指针的迭代器,std::fill_n(ptr, n, 0)应该做同样的事情memset(ptr, 0, n * sizeof(*ptr))(但请参阅@ KeithThompson对此答案的评论).
对于C++ 11/C++ 14/C++ 17模式下的C++编译器,我可以期望将这些条件编译为相同的代码吗?当/如果它们没有编译成相同的代码,是否与-O0有显着的性能差异?-O3?
注意:当然,一些/大多数答案可能是特定于编译器的.我只对一两个特定的编译器感兴趣,但请写下你知道答案的编译器.
请考虑以下代码:
#include <string.h>
void bar(char c);
void foo(const char* __restrict__ ss)
{
for (int i = 0; i < strlen(ss); ++i)
{
bar(*ss);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望strlen(ss)在这些基本理想的条件下将其提升出来; 然而 - 它不是,既不是由clang 5.0也不是由gcc 7.3和最大优化(-O3).
为什么会这样?
注意:灵感来自(我的回答)这个问题.
我有一大块内存,比如256 KiB或更长.我想计算整个块中的1位数,或者换句话说:为所有字节添加"种群计数"值.
我知道AVX-512有一个VPOPCNTDQ指令,它计算512位向量中每个连续64位的1位数,而IIANM应该可以在每个周期发出其中一个(如果一个适当的SIMD向量寄存器是可用) - 但我没有任何编写SIMD代码的经验(我更像是一个GPU人).此外,我不是100%确定AVX-512目标的编译器支持.
在大多数CPU上,仍然没有(完全)支持AVX-512; 但AVX-2广泛可用.我无法找到类似于VPOPCNTDQ的低于512位的向量化指令,所以即使理论上我也不确定如何使用支持AVX-2的CPU快速计算位数; 也许这样的事情存在,我只是错过了它?
无论如何,对于两个指令集中的每一个,我都很欣赏一个简短的C/C++函数 - 使用一些内部包装库或内联汇编.签名是
uint64_t count_bits(void* ptr, size_t size);
Run Code Online (Sandbox Code Playgroud)
笔记:
AVX-512 指令集扩展之一是AVX-512 + GFNI,“伽罗华域新指令”。
伽罗瓦理论是关于域扩展的。这与处理矢量化整数或浮点值有什么关系?指令应该执行“Galois 域仿射变换”,它的逆,以及“Galois 域乘以字节”。
那些是什么领域?这些说明实际上做了什么,它有什么用?