小编nur*_*bha的帖子

C++类的大小

这是打印不同类的大小的代码

#include <iostream>

using namespace std;

class EmptyClass
{    
};

class AbstractClass
{
  public: 
          virtual void funcOne() = 0;
          virtual void funcTwo() = 0;
};

class NotAbstrClass
{
  public: int virtFunc( int );
};

class MixClass
{
  public:
          virtual void clFunc( int );
          static int i;
          int j;
};

int main()
{
    // Print size of class or class objects
    cout<<"Size of empty class: "<< sizeof(EmptyClass)<<endl;          
    cout<<"Size of Abstract class :"<< sizeof(AbstractClass)<<endl;
    cout<<"Size of Non Abstract class: "<< sizeof(NotAbstrClass)<<endl;
    cout<<"Size …
Run Code Online (Sandbox Code Playgroud)

c++ class object sizeof

10
推荐指数
2
解决办法
2万
查看次数

如何在Python中对有符号和无符号值进行算术右移

某些语言(例如 Java、Verilog)同时具有按位逻辑运算符(<<、>>)和算术移位运算符(<<<、>>>)。

对于无符号值,逻辑移位和算术移位具有相同的操作。假设 8'b11000101 是 8 位无符号数 197 的二进制表示,那么

8'b11000101 >>  2 => 8'b00110001
8'b11000101 >>> 2 => 8'b00110001
8'b11000101 <<  2 => 8'b00010100
8'b11000101 <<< 2 => 8'b00010100
Run Code Online (Sandbox Code Playgroud)

对于有符号值,只有算术和逻辑左移操作是相同的,但算术右移会导致符号扩展。假设 8'b11000101 是 8 位有符号数 -59 的二进制表示,那么

8'b11000101 >>  2 => 8'b00110001
8'b11000101 >>> 2 => 8'b11110001
8'b11000101 <<  2 => 8'b00010100
8'b11000101 <<< 2 => 8'b00010100
Run Code Online (Sandbox Code Playgroud)

Python只有逻辑移位运算符,没有算术移位运算符。那么如何在Python中实现有符号和无符号值的算术右移呢?

python math bit-shift shift bitwise-operators

9
推荐指数
2
解决办法
1万
查看次数

在阵列中找到频率最高的元素的最快算法是什么

我有两个输入数组X和Y.我想返回数组X的元素,它在数组Y中以最高频率出现.

这样做的天真方式要求对于数组X的每个元素x,我线性搜索数组Y的出现次数,然后返回具有最高频率的元素x.这是伪算法:

 max_frequency = 0
 max_x = -1             // -1 indicates no element found
 For each x in X
     frequency = 0
     For each y in Y
         if y == x
             frequency++
     End For
     If frequency > max_frequency
         max_frequency = frequency
         max_x = x
     End If
 End For
 return max_x
Run Code Online (Sandbox Code Playgroud)

由于存在两个嵌套循环,因此该算法的时间复杂度为O(n ^ 2).我可以在O(nlogn)或更快的时候这样做吗?

sorting algorithm complexity-theory search

6
推荐指数
1
解决办法
2600
查看次数

增加 CUDA 中每个线程寄存器的使用

通常建议降低每个线程的寄存器压力以增加 warp 占用,从而提供更大的机会通过 warp 级多线程 (TLP) 隐藏延迟。为了减少寄存器压力,可以使用更多的每个线程本地内存或每个线程块共享内存。CUDA nvcc 编译器也可以强制每个线程使用更少的寄存器。这种方法对于具有良好算术延迟的工作负载很有用,即 ALU 操作与内存 r/w 访问请求的比率很高。然而,对于计算量非常少且内存访问更频繁的延迟关键应用程序,这种方法实际上往往会降低性能。

在此类延迟关键应用程序的情况下,将尽可能多的数据放入片上寄存器或共享内存中更有意义,然后在用全局内存中的下一个数据块替换它之前尽可能多地使用它。当然,通过增加寄存器压力,warp 占用率降低,但现在我们使用快速片上寄存器隐藏片外存储器延迟。增加每个线程寄存器使用的方法是通过展开循环或计算每个线程更多的输出数据来增加 ILP(这也基本上通过对更多输入执行相同的工作来增加 ILP)。这种方法基本上是由 Volkov(Better Performance at Lower Occupancy)提出的。

现在 nvcc 编译器驱动程序有一个名为 maxrregcount 的命令行选项,它允许更改每个线程寄存器的使用。使用此选项一次可以强制编译器减少每个线程寄存器的使用,但不能强制它增加它。我有一个案例,我想增加每个线程寄存器的使用,但我无法在内核中展开循环,因为循环边界是数据相关且动态的。到目前为止,我已经尝试了一些技巧,但我已经没有关于如何增加每个线程寄存器使用的想法。任何人都可以建议增加单个 CUDA 线程的寄存器使用率的方法吗?

memory cuda latency cpu-registers

5
推荐指数
1
解决办法
3718
查看次数

有条件地将一个矢量复制到另一个矢量的最快方法

这个问题与现有问题有关:快速将一个向量复制到另一个向量

我有一个矢量源矢量S,我想创建一个目标矢量D,它只有满足特定条件的S元素(比如元素是偶数).注意,源向量是常量向量.

我可以想到两个STL算法来做到这一点:

  • copy_if
  • 的remove_if

在这两种方法中,我都需要确保目标向量D的大小足够大.因此,我需要创建与S大小相同的初始向量D.此外,在这两种方法中,我想将向量D压缩为与其中元素数量相同的长度.我不知道哪一个更快或更方便但我不知道有条件地复制矢量的更好的方法?

c++ stl copy vector

5
推荐指数
2
解决办法
5660
查看次数

在 CUDA 设备代码和主机代码中创建模板类对象时未解析的外部函数

我在文件template.cutemplate.cuh 中定义了一个类模板。我使用hostdevice关键字将构造函数和析构函数标记为设备和主机可调用。

模板.cuh

#pragma once

#include "cuda_runtime.h"

template<class T>
class Foo
{
public:

    __host__ __device__
    Foo();

    __host__ __device__
    ~Foo();
};
Run Code Online (Sandbox Code Playgroud)

模板文件

#include "template.cuh"

template<class T>
__host__ __device__
Foo<T>::Foo()
{

}

template<class T>
__host__ __device__
Foo<T>::~Foo()
{

}

// Instantiating template of type int
template
class Foo<int> ;
Run Code Online (Sandbox Code Playgroud)

我的主要功能在Kernel.cu文件中,其中包含template.cuh头文件。我只是在主机和设备代码中实例化一个 int 类型的 Foo 对象。

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "template.cuh"

__global__ void addKernel(int *c, const int *a, const …
Run Code Online (Sandbox Code Playgroud)

c++ templates cuda visual-studio-2013

3
推荐指数
1
解决办法
2247
查看次数

为什么不能使CUDA C++类的主机/设备成员函数超载

我有一个3d矢量类,其成员函数标记为主机和设备函数.下面是其中一个成员函数的片段:

__host__ __device__
double Vector::GetMagReciprocal()
{
    double result = 1/sqrt(x*x + y*y + z*z);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

我想要实现的是对主机和设备功能进行单独定义,以便在设备上执行时使用CUDA数学内部函数rqsrt可以获得更好的性能.我这样做的方法是为主机和设备重载这个成员函数:

__host__
double Vector::GetMagReciprocal()
{
    double result = 1/sqrt(x*x + y*y + z*z);
    return result;
}

__device__
double Vector::GetMagReciprocal()
{
    double result = rsqrt(x*x + y*y + z*z);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

现在,当我使用nvcc(-x cu flag)编译Vector.cpp文件时,出现以下错误

函数"Vector :: GetMagReciprocal"已经定义

现在我想知道为什么NVIDIA不支持这种超载.

我可以想到实现分离的其他方法,但它们有自己的问题:

  • 在vector类中为主机和设备创建单独的成员函数,例如GetMagReciprocalHostGetMagReciprocalDevice,并在主机/设备代码中调用相应的函数
  • 有一个成员函数GetMagReciprocal但传递一个标志到成员函数,以在主机代码和设备代码之间进行选择

也许有另一种更简单的方法来实现这一目标.如果有人有任何建议,那就太好了.

REEDITED:我没有提到使用CUDA ARCH标志生成单独的主机和设备的条件编译的可能性.这实际上是我在修改成员函数时所做的第一件事.但有些事情在我脑海中浮现,说这不起作用.也许我对我对这个编译标志的使用的理解是错误的.因此,sgarizvi提出的答案是正确的答案

c++ cuda overloading device member-functions

3
推荐指数
1
解决办法
1693
查看次数

空间排序在3d空间中的百万点

我在3d空间中收集了百万点.

每个点都是一个对象

Struct Point
{
    double x;
    double y;
    double z;
};
Run Code Online (Sandbox Code Playgroud)

百万点以一些随机顺序存储在c ++向量MyPoints中.

我想根据空间中点的空间分布对这些百万点进行排序,这样物理上更接近的点在排序后也应该在我的阵列内更近.

我对如何做到这一点的第一个猜测如下:首先对Z轴进行排序,然后沿Y轴排序点,然后沿X轴排序点

MyPointsSortedAlongZ = Sort(MyPoints, AlongZAxis )
MyPointsSortedAlongY = Sort(MyPointsSortedAlongZ , AlongYAxis  )
MyPointsSortedAlongX = Sort(MyPointsSortedAlongY , AlongYAxis  )
Run Code Online (Sandbox Code Playgroud)

首先,我不知道这种方法是否正确.我的最终点数MyPointsSortedAlongX是否会在空间上完美排序(或几乎在空间上排序)?

其次,如果这种方法是正确的,它是最快的方法.有什么更好的方法呢?

sorting algorithm 3d computational-geometry

2
推荐指数
1
解决办法
2595
查看次数