小编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
查看次数

无法从静态初始化代码启动CUDA内核

我有一个类在其构造函数中调用内核,如下所示:

"ScalarField.h"

#include <iostream>

    void ERROR_CHECK(cudaError_t err,const char * msg) {
        if(err!=cudaSuccess) {
            std::cout << msg << " : " << cudaGetErrorString(err) << std::endl;
            std::exit(-1);
        }
    }

    class ScalarField {
    public:
        float* array;
        int dimension;

        ScalarField(int dim): dimension(dim) {
            std::cout << "Scalar Field" << std::endl;
            ERROR_CHECK(cudaMalloc(&array, dim*sizeof(float)),"cudaMalloc");
        }
    };
Run Code Online (Sandbox Code Playgroud)

"classA.h"

#include "ScalarField.h"


static __global__ void KernelSetScalarField(ScalarField v) {
    int index = threadIdx.x + blockIdx.x * blockDim.x;
    if (index < v.dimension) v.array[index] = 0.0f;
}

class A {
public:
    ScalarField v; …
Run Code Online (Sandbox Code Playgroud)

c++ cuda global-variables static-initialization

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

相对于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
查看次数

使用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
查看次数

如何使用 doxygen 记录函数的未命名参数?

有了 doxygen,我习惯了这样写

/**
 * @brief blah blah
 *
 * @param foo description of foo
 * @param bar description of bar
 * @return description of the return value
 */
int f(int foo, unsigned bar);
Run Code Online (Sandbox Code Playgroud)

但是如果我不命名其中一个参数怎么办?:

int f(int, unsigned bar);
Run Code Online (Sandbox Code Playgroud)

当我无法通过名称引用该参数时,如何记录该参数?

documentation doxygen

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

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

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

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

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

galois-field avx512

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

CMAKE_SYSTEM_PROCESSOR 的可能值是什么?

在 CMake 中, 的可能值有哪些CMAKE_SYSTEM_PROCESSOR?至少,AMD、英特尔、苹果、高通等常见处理器系列的值是多少?

我在CMake 文档中找不到此信息。

cmake

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

如果我们有ranges::zip和views::transform,为什么我们需要ranges::zip_transform?

在 C++23 中,范围(子)库已获得std::ranges::zip,它将多个范围压缩为单个范围std::tuple(或对)。这很好,并且不需要我们自己实现它,使用boost::zip_iterator或诉诸这种黑客*

然而,我们也得到std::ranges::zip_transform. 为什么我们需要它?毕竟,我们可以将 a 应用于ranges::views::transform压缩范围,不是吗?那么,是不是zip_transform多余呢?


* - 该 hack 在 C++11 中运行良好,并且不需要数万行带有概念的代码......

c++ idioms tuples std-ranges

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