gpt4 book ai didi

cuda - CUDA的调用图

转载 作者:行者123 更新时间:2023-12-01 05:09:58 26 4
gpt4 key购买 nike

我正在尝试使用egypt为CUDA中的代码生成调用图,但是通常的方法似乎不起作用(因为nvcc没有任何标志可以执行与-fdump-rtl-扩大)。

更多细节 :

我有一个很大的代码(我不是作者),它跨越多个.cu文件,如果我有一个调用图,对我来说更容易理解它在做什么。

我敢打赌,这个问题的答案也将对其他人有用。

关于如何使用cuda(.cu)文件完成操作的任何想法?

最佳答案

您可以使用CUDA support of clang 3.8进行此操作。

首先,编译您的CUDA代码以发出llvm(例如在安装了CUDA 7.5的Windows上的示例):

clang++ -c main.cu --cuda-gpu-arch=sm_35 -o main.ll -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\include"


然后,使用生成的ll使用 opt构建调用图:

opt.exe main.ll -analyze -dot-callgraph


请注意, opt不是默认二进制发行版的一部分,您可能需要自己构建它(我有一个3.7.1构建,它已经能够管理3.8中的ll)。

示例main.cu文件:

#include <cuda_runtime.h>
__device__ int f() { return 1; }
__device__ float g(float* a) { return a[f()] ; }
__device__ float h() { return 42.0f ; }
__global__ void kernel (int a, float* b)
{
int c = a + f();
g(b);
b[c] = h();
}


生成的点文件:

digraph "Call graph" {
label="Call graph";

Node0x1e3d438 [shape=record,label="{external node}"];
Node0x1e3d438 -> Node0x1e3cfb0;
Node0x1e3d438 -> Node0x1e3ce48;
Node0x1e3d438 -> Node0x1e3d0a0;
Node0x1e3d438 -> Node0x1e3d258;
Node0x1e3d438 -> Node0x1e3cfd8;
Node0x1e3d438 -> Node0x1e3ce98;
Node0x1e3d438 -> Node0x1e3d000;
Node0x1e3d438 -> Node0x1e3cee8;
Node0x1e3d438 -> Node0x1e3d078;
Node0x1e3d000 [shape=record,label="{__cuda_module_ctor}"];
Node0x1e3d000 -> Node0x1e3ce98;
Node0x1e3d000 -> Node0x1e3d168;
Node0x1e3d078 [shape=record,label="{__cuda_module_dtor}"];
Node0x1e3d078 -> Node0x1e3cee8;
Node0x1e3cfb0 [shape=record,label="{^A?f@@YAHXZ}"];
Node0x1e3d0a0 [shape=record,label="{^A?h@@YAMXZ}"];
Node0x1e3ce48 [shape=record,label="{^A?g@@YAMPEAM@Z}"];
Node0x1e3ce48 -> Node0x1e3cfb0;
Node0x1e3d258 [shape=record,label="{^A?kernel@@YAXHPEAM@Z}"];
Node0x1e3d258 -> Node0x1e3cfb0;
Node0x1e3d258 -> Node0x1e3ce48;
Node0x1e3d258 -> Node0x1e3d0a0;
Node0x1e3d168 [shape=record,label="{__cuda_register_kernels}"];
Node0x1e3cee8 [shape=record,label="{__cudaUnregisterFatBinary}"];
Node0x1e3cee8 -> Node0x1e3d528;
Node0x1e3cfd8 [shape=record,label="{__cudaRegisterFunction}"];
Node0x1e3cfd8 -> Node0x1e3d528;
Node0x1e3ce98 [shape=record,label="{__cudaRegisterFatBinary}"];
Node0x1e3ce98 -> Node0x1e3d528;
}

关于cuda - CUDA的调用图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11423266/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com