小编ein*_*ica的帖子

CUDA:如何直接在GPU上使用thrust :: sort_by_key?

Thrust库可用于对数据进行排序.调用可能看起来像这样(带有键和值向量):

thrust::sort_by_key(d_keys.begin(), d_keys.end(), d_values.begin());
Run Code Online (Sandbox Code Playgroud)

称为在CPU上,以d_keysd_values在CPU存储器是; 并且大部分执行都发生在GPU上.

但是,我的数据已经在GPU上?如何使用Thrust库直接在GPU上执行高效排序,即sort_by_key从内核调用函数?

此外,我的数据包括或者是unsigned long long int或者unsigned int始终是数据的键 unsigned int.我应该如何对这些类型进行推力调用?

sorting cuda thrust

8
推荐指数
1
解决办法
4136
查看次数

glib是否能以一种不引人注目的方式使用?

我在标准C库的顶部为C寻找一个好的通用库,并且已经看到了一些使用glib的建议.你的代码中有多么"突兀"?为了解释我所说的突出性的意思是,我在首先注意到的参考手册基本类型部分,心里对自己说,"什么,我是不是要开始使用gint,gchar和gprefixing geverything杜松子酒广明源的G-码gnow?"

更一般地说,您是否可以仅在本地使用它而不需要在代码中使用其他功能或文件来了解其用途?它是否强制对代码进行某些假设,或者对编译/链接过程施加约束?是否在运行时为全局数据结构占用了大量内存?等等

c coding-style glib

8
推荐指数
1
解决办法
760
查看次数

Java是否有默认的拷贝构造函数(比如在C++中)?

Java是否具有C++的默认复制构造函数?如果它有一个 - 如果我明确地声明另一个构造函数(不是复制构造函数),它是否仍然可用?

c++ java language-comparisons copy-constructor object-construction

8
推荐指数
1
解决办法
7932
查看次数

如何获取当前函数的标识符?

在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)

笔记:

  • 我只对预处理时间感兴趣.
  • 我宁愿不用预处理器调用替换我的函数定义 - 虽然我知道这可能会起作用.

c c++ macros c-preprocessor

8
推荐指数
1
解决办法
232
查看次数

什么是jamfile?

我正在尝试使用boost_1_55_0库,并且我不断遇到对jamfiles的引用.

什么是果酱文件?

为什么有bjam和jamfiles的多个版本?

c++ boost bjam

8
推荐指数
1
解决办法
5471
查看次数

如何实现std :: experimental :: source_location?

库基础知识的C++扩展,版本2(N4564)介绍了该类型std::experimental::source_location.

§14.1.2[reflection.src_loc.creation]说:

static constexpr source_location current() noexcept;
Run Code Online (Sandbox Code Playgroud)

返回:当函数调用(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)

c++ reflection fundamentals-ts c++17 std-source-location

8
推荐指数
1
解决办法
2145
查看次数

相对于memset,我可以期待std :: fill_n(ptr,n,0)的性能如何?

对于作为ptr指针的迭代器,std::fill_n(ptr, n, 0)应该做同样的事情memset(ptr, 0, n * sizeof(*ptr))(但请参阅@ KeithThompson对此答案的评论).

对于C++ 11/C++ 14/C++ 17模式下的C++编译器,我可以期望将这些条件编译为相同的代码吗?当/如果它们没有编译成相同的代码,是否与-O0有显着的性能差异?-O3?

注意:当然,一些/大多数答案可能是特定于编译器的.我只对一两个特定的编译器感兴趣,但请写下你知道答案的编译器.

c++ memory memset c++-standard-library c++11

8
推荐指数
1
解决办法
1021
查看次数

为什么gcc和clang没有将strlen从这个循环中提升出来?

请考虑以下代码:

#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).

为什么会这样?

注意:灵感来自(我的回答)这个问题.

c gcc clang compiler-optimization hoisting

8
推荐指数
2
解决办法
365
查看次数

使用AVX-512或AVX-2对大数据计数1位(总体计数)

我有一大块内存,比如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)

笔记:

assembly bitcount avx2 avx512 population-count

8
推荐指数
1
解决办法
932
查看次数

AVX-512 伽罗瓦域相关指令的用途是什么?

AVX-512 指令集扩展之一是AVX-512 + GFNI,“伽罗华域新指令”。

伽罗瓦理论是关于域扩展的。这与处理矢量化整数或浮点值有什么关系?指令应该执行“Galois 域仿射变换”,它的逆,以及“Galois 域乘以字节”。

那些是什么领域?这些说明实际上做了什么,它有什么用?

galois-field avx512

8
推荐指数
2
解决办法
1633
查看次数