cuda api的采样主要cudart提供了profiler的接口,定义在cuda_profiler_api.h文件中,下面的代码是一个例子。
参考 https://blog.csdn.net/weixin_43603658/article/details/130441136,可以看到使用cudaProfilerStart和cudaProfilerEnd可以查看程序中指定段的性能数据。
nsys在这个基础上可能更加丰富了采样数据的类型,如ptrace看osrt的数据。
#include <iostream>
#include <cuda_runtime.h>
#include <cuda_profiler_api.h>
// 定义向量长度
const int N = 1024;
// 核函数,实现简单的向量加法
__global__ void vectorAdd(const float* a, const float* b, float* c) {
int tid = blockIdx.x * blockDim.x + threadIdx.x;
if (tid < N) {
c[tid] = a[tid] + b[tid];
}
}
int main() {
float* a, * b, * c;
float* d_a, * d_b, * d_c;
// 在主机上分配内存
a = new float[N];
b = new float[N];
c = new float[N];
// 在设备上分配内存
cudaMalloc((void**)&d_a, N * sizeof(float));
cudaMalloc((void**)&d_b, N * sizeof(float));
cudaMalloc((void**)&d_c, N * sizeof(float));
// 初始化主机上的向量数据
for (int i = 0; i < N; i++) {
a[i] = i;
b[i] = i * 2;
}
// 将数据从主机复制到设备
cudaMemcpy(d_a, a, N * sizeof(float), cudaMemcpyHostToDevice);
cudaMemcpy(d_b, b, N * sizeof(float), cudaMemcpyHostToDevice);
// 启动CUDA profiler
cudaProfilerStart();
// 定义线程块和线程数量
int blockSize = 256;
int numBlocks = (N + blockSize - 1) / blockSize;
// 调用核函数
vectorAdd<<<numBlocks, blockSize>>>(d_a, d_b, d_c);
// 检查核函数执行是否出错
cudaError_t err = cudaGetLastError();
if (err!= cudaSuccess) {
std::cerr << "CUDA Error: " << cudaGetErrorString(err) << std::endl;
}
// 停止CUDA profiler
cudaProfilerStop();
// 将结果从设备复制回主机
cudaMemcpy(c, d_c, N * sizeof(float), cudaMemcpyDeviceToHost);
// 释放设备内存
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);
// 释放主机内存
delete[] a;
delete[] b;
delete[] c;
return 0;
}
标签:int,void,float,profiler,cuda,tid,sizeof
From: https://www.cnblogs.com/zwlwf/p/18660765