小编Dan*_*iel的帖子

使用CUDA内核中的许多固定大小的矩阵

我希望工作大约4000个固定大小(3x3,4x4)矩阵,做矩阵求逆和特征分解等事情.

在我看来,并行化这种方法的最佳方法是让许多GPU线程中的每一个都在单个问题实例上工作.

有合理的方法吗?我已经阅读:http://www.culatools.com/blog/2011/12/09/batched-operations/但据我所知,它始终是"正在处理"的东西,没有解决方案.三年后,我希望有一个很好的解决方案.

到目前为止,我看过:

  • 在CUDA内核中使用Eigen:http://eigen.tuxfamily.org/dox-devel/TopicCUDA.html.但这还处于起步阶段:因此,似乎效果不好,有些事情没有实施.而且,我不确定它是否针对CUDA进行了优化.几乎没有文档,代码的唯一例子是测试文件(eigen/test/cuda_basic.cu).当我尝试在CUDA内核中使用Eigen时,在内核中声明一个简单的东西Eigen::MatrixXf并不能用nvcc V7.0.27Eigen 3.2.90(mercurial)编译.
  • 使用cuBLAS设备API库在内核中运行BLAS例程.似乎cuBLAS及其同类产品即使对于小型矩阵也要编写并行化,这对于我感兴趣的3x3和4x4矩阵来说似乎有点过分和可能很慢.而且,我不确定是否还有像cuBLAS这样的东西也可以做特征分解或SVD.(据我所知,CULA不支持从内核中调用它的例程).
  • 使用CUDA流批处理内核.在CUDA Toolkit v7.0的cuBLAS文档的第2.1.7节"批处理内核"中,建议使用此方法.但是"""在实践中,不可能同时执行超过16个并发内核""",因此处理4000个小矩阵会很糟糕.在前面提到的CULA博客文章的链接中,我引用,""理论上,人们可以在每个问题上使用CUDA流并一次启动一个问题.由于两个原因,这会表现不佳.首先是每个块的线程数量太低; [...]其次是以这种方式启动数千个操作所产生的开销是不可接受的,因为启动代码与执行代码一样昂贵(如果不是更昂贵) CPU上的矩阵."""
  • 在内核中实现我自己的矩阵乘法和特征分解.这可能非常慢,并且可能另外耗费时间来实现.

在这一点上,我很想放弃在GPU上做这件事.遗憾的是,因为我希望算法的实时性能要求每0.1秒反转4000个3x3矩阵大约100次.

c++ cuda gpgpu matrix

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

在C++中封装大量参数14

我想写它使用许多参数,我将调用一个函数a,bc.我有四种在C++ 14中实现它的选择.

对于2018年的新现代C++项目,其中一种风格最符合ISO C++的理念?其他风格指南推荐哪些款式?

面向对象的风格

class Computer {
    int a, b, c;
public:
    Computer(int a, int b, int c) : a(a), b(b), c(c) {}
    int compute(int) const {
        // do something with a, b, c
    }
};
...
const Computer computer(a, b, c);
int result = computer.compute(123);
Run Code Online (Sandbox Code Playgroud)

优点:

  • 易于C++程序员掌握

缺点:

  • 要计算地图或折叠操作中的内容,我们必须做笨重的事情 [computer](int input){ return computer.compute(input); }

C风格

struct ComputeParams {
    int a, b, c;
};

int compute(const ComputeParams &params, int input) { …
Run Code Online (Sandbox Code Playgroud)

c++ oop encapsulation functional-programming c++14

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

如何读取tcpdump生成的包含大UDP数据包的pcap文件并重新组装IP碎片数据包?

我想读取由 tcpdump 生成的 pcap 文件,该文件包含经过IPV4 分片的大型 UDP 数据包。原始数据包的大小约为 22000 字节。

在 C++ 中,我会使用 libtins 和它的 IPV4Reassembler。有没有办法在 Rust 中做类似的事情?

目前在 Rust 中,这是我到目前为止所写的内容:高度不完整的第一次尝试(使用 crate pnet):

use pnet::packet::{
    ethernet::{EtherTypes, EthernetPacket},
    ip::IpNextHeaderProtocols,
    ipv4::Ipv4Packet,
    udp::UdpPacket,
    Packet,
};

struct Ipv4Reassembler {
    cap: pcap::Capture<pcap::Offline>,
}

impl Iterator for Ipv4Reassembler {
    type Item = Vec<u8>;

    fn next(&mut self) -> Option<Self::Item> {
        let mut payload = Vec::<u8>::new();
        while let Some(packet) = self.cap.next().ok() {
            // todo: handle packets other than Ethernet packets
            let ethernet = EthernetPacket::new(packet.data).unwrap();
            match …
Run Code Online (Sandbox Code Playgroud)

ip networking udp rust ip-fragmentation

5
推荐指数
0
解决办法
176
查看次数