我想写一个程序来获取我的缓存大小(L1,L2,L3).我知道它的一般想法.
所以我写了一个小程序.这是我的代码:
#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) 通常 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。