通过gpgpu模拟器获取内存地址
通过gpgpu模拟器获取内存地址
GPGPU-sim能够在Linux系统下,提供对GPU的功能模拟和性能仿真,让你在没有装NVIDIA显卡的情况下可以编译并运行CUDA程序。当然它更重要的意义是,可以通过修改仿真参数,让开发者修改GPU内部架构,并进行性能仿真,以针对自己的项目需求进行更好的代码设计,获得更好的性能表现
步骤
cuda 版本不宜太高,具体适用的版本在clone下来的git里有 常用的版本基本都可以
This version of GPGPU-Sim has been tested with a subset of CUDA version 4.2, 5.0, 5.5, 6.0, 7.5, 8.0, 9.0, 9.1, 10, and 11
1. 获取项目代码
git clone https://github.com/gpgpu-sim/gpgpu-sim_distribution.git
2. 进入目录设置环境 ,source setup_environment
要出现successed才算成功。
cd gpgpu-sim_distribution
source setup_environment
如果不行,执行以下步骤:
export CUDA_INSTALL_PATH=/usr/local/cuda
export PATH=$CUDA_INSTALL_PATH/bin:$PATH
export LD_LIBRARY_PATH=$CUDA_INSTALL_PATH/lib64:$LD_LIBRARY_PATH
sudo apt-get install xutils-dev
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install libgl1-mesa-dev
3. 编译,过程可能比较久
cd $GPGPUSIM_ROOT
make
make docs
4. 检查配置文件:gpgpusim.config 是架构配置信息
$GPGPUSIM_ROOT/configs/tested-cfgs/<gpgpusim.config>
5.编写cuda程序: 矩阵乘法 matrixmul.cu 示例
#include <stdio.h>
#include <cuda_runtime.h>
// 矩阵维度
#define N 1024 // 矩阵大小 N x N
// CUDA内核,执行矩阵乘法
__global__ void matrixMulKernel(float* A, float* B, float* C, int n) {
// 获取当前线程对应的行和列索引
int row = blockIdx.y * blockDim.y + threadIdx.y;
int col = blockIdx.x * blockDim.x + threadIdx.x;
float value = 0.0;
// 矩阵乘法的核心计算:C(row, col) = A(row, :) * B(:, col)
if (row < n && col < n) {
for (int k = 0; k < n; ++k) {
value += A[row * n + k] * B[k * n + col];
}
C[row * n + col] = value;
}
}
int main() {
int size = N * N * sizeof(float);
float *h_A, *h_B, *h_C; // 主机内存
float *d_A, *d_B, *d_C; // 设备内存
// 分配主机内存
h_A = (float*)malloc(size);
h_B = (float*)malloc(size);
h_C = (float*)malloc(size);
// 初始化矩阵A和B
for (int i = 0; i < N * N; i++) {
h_A[i] = 1.0f; // 简单起见,将A和B初始化为全1矩阵
h_B[i] = 1.0f;
}
// 分配设备内存
cudaMalloc(&d_A, size);
cudaMalloc(&d_B, size);
cudaMalloc(&d_C, size);
// 将主机内存拷贝到设备内存
cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);
// 定义线程块和网格维度
dim3 threadsPerBlock(16, 16);
dim3 blocksPerGrid((N + threadsPerBlock.x - 1) / threadsPerBlock.x,
(N + threadsPerBlock.y - 1) / threadsPerBlock.y);
// 调用CUDA内核
matrixMulKernel<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, d_C, N);
// 将结果从设备内存拷贝到主机内存
cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);
// 验证结果
bool success = true;
for (int i = 0; i < N * N; i++) {
if (h_C[i] != N) {
success = false;
break;
}
}
if (success) {
printf("矩阵相乘成功!\n");
} else {
printf("矩阵相乘失败!\n");
}
// 释放内存
free(h_A);
free(h_B);
free(h_C);
cudaFree(d_A);
cudaFree(d_B);
cudaFree(d_C);
return 0;
}
6. 适用gpgpusim编译cuda程序:
在使用gpgpu-sim时,将要编译的CUDA源代码(.cu文件)复制到
/configs/tested-cfgs/目录中的某个文件里,这个文件夹里是不同型号GPU的模拟config文件,例如想模拟这个程序在GTX480显卡上的运行状况,就将代码复制到GTX480对应的文件夹下,然后在命令行用nvcc进行编译,编译时一定要加参数,如下
nvcc --cudart shared matrixmul.cu
7. 查看链路是否运行正确:
ldd a.out
8. 运行a.out文件即可
Ref
- https://blog.csdn.net/NKU_Yang/article/details/114662776
- https://github.com/gpgpu-sim/gpgpu-sim_distribution
原文地址:https://blog.csdn.net/2303_77224751/article/details/143086251
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!