小编Kan*_*Liu的帖子

编写程序以获取CPU缓存大小和级别

我想写一个程序来获取我的缓存大小(L1,L2,L3).我知道它的一般想法.

  1. 分配一个大阵列
  2. 每次访问不同大小的部分.

所以我写了一个小程序.这是我的代码:

#include <cstdio>
#include <time.h>
#include <sys/mman.h>

const int KB = 1024;
const int MB = 1024 * KB;
const int data_size = 32 * MB;
const int repeats = 64 * MB;
const int steps = 8 * MB;
const int times = 8;

long long clock_time() {
    struct timespec tp;
    clock_gettime(CLOCK_REALTIME, &tp);
    return (long long)(tp.tv_nsec + (long long)tp.tv_sec * 1000000000ll);
}

int main() {
    // allocate memory and lock
    void* map = mmap(NULL, (size_t)data_size, PROT_READ …
Run Code Online (Sandbox Code Playgroud)

c++ performance computer-architecture cpu-cache

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

有没有办法在dnn的gpu上融合全连接层(gemm)和激活层(relu/sigmoid)?

通常 dnn 中的一层由 MatMul、BiasAdd、Relu 组成,cuBlas 为 MatMul 提供 Gemm,我们可以在另一个内核中为 GPU 做 BiasAdd 和 Relu。它们是两个 GPU lanuch 调用,有没有办法将它们融合在一起并使它们只是一个?我查看了cuBlas, cudnn,但没有找到任何东西。我认为这并不难,因为 BiasAdd 和 Relu 只是元素操作,而融合使它更有效率。

这是背景:

我正在开发一个多 dnn 模型集成的在线预测服务。通过分析我的程序,我发现我的 CPU 和 GPU 都没有得到充分利用,而是在与 GPU 相关的函数调用(如 lanuchKernel)上请求块。似乎libcuda 有一个大锁。我正在使用 tensorflow,启用 XLA,所以我使用 nvprof 和 tensorflow HLO 来可视化 GPU 调用,并且只有融合(即biasadd 和 relu)操作。虽然做了kernel fusion,但是lanuchKernel调用还是太多,GPU利用率只有60%。我在一个过程中尝试了多个 cuda 上下文,改进是微不足道的。

顺便说一下,我使用的是一个 GPU,Tesla P100。

gpu tensorflow cudnn tensorflow-xla

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