HIP技术测试2-CPU2DCU和DCU2DCU带宽测试

2023-11-06 08:50

本文主要是介绍HIP技术测试2-CPU2DCU和DCU2DCU带宽测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

HIP技术测试2-CPU2DCU和DCU2DCU带宽测试

1.节点内CPU2DCU带宽测试

#include <stdio.h> 
#include <hip/hip_runtime.h> #define NSTREAM 2 
#define BDIM 512 void initialData(float *ip, int size) 
{int i;for (i = 0; i < size; i++) {ip[i] = (float)(rand() & 0xFF) / 10.0f;         //printf("%f\n", ip[i]);     } 
} void sumArraysOnHost(float *A, float *B, float *C, const int N) 
{for (int idx = 0; idx < N; idx++)         C[idx] = A[idx] + B[idx];
}__global__ void sumArrays(float *A, float *B, float *C, const int N) 
{int idx = blockIdx.x * blockDim.x + threadIdx.x;if (idx < N) { for (int j = 0; j < 60; j++) { C[idx] = A[idx] + B[idx]; } }
}void checkResult(float *hostRef, float *gpuRef, const int N) {double epsilon = 1.0E-8;     bool match = 1;for (int i = 0; i < N; i++) { if (abs(hostRef[i] - gpuRef[i]) > epsilon) { match = 0;             printf("Arrays do not match!\n");             printf("host %5.2f gpu %5.2f at %d\n", hostRef[i], gpuRef[i], i);             break; } }if (match) printf("Arrays match.\n\n");
}int main(int argc, char **argv) 
{printf("> %s Starting...\n", argv[0]);int dev = 0;     hipSetDevice(dev);     hipDeviceProp_t deviceProp;     hipGetDeviceProperties(&deviceProp, dev);printf("> Using Device %d: %s\n", dev, deviceProp.name);// set up data size of vectors     //int nElem = 1 << 2;     int nElem = 1 << 24;     printf("> vector size = %d\n", nElem);     size_t nBytes = nElem * sizeof(float);     printf("> size nBytes = %ld MB\n", nBytes/1024/1024); float *h_A, *h_B, *h_C;     hipHostMalloc((void**)&h_A, nBytes, hipHostMallocDefault);     hipHostMalloc((void**)&h_B, nBytes, hipHostMallocDefault);     hipHostMalloc((void**)&h_C, nBytes, hipHostMallocDefault);initialData(h_A, nElem);     initialData(h_B, nElem);     memset(h_C, 0, nBytes);//sumArraysOnHost(h_A, h_B, hostRef, nElem); float *d_A, *d_B, *d_C;     hipMalloc((float**)&d_A, nBytes);     hipMalloc((float**)&d_B, nBytes);     hipMalloc((float**)&d_C, nBytes);hipEvent_t start, stop;     hipEventCreate(&start);     hipEventCreate(&stop);dim3 block(BDIM);     dim3 grid((nElem + block.x - 1) / block.x);     printf("> grid (%d,%d) block (%d,%d)\n", grid.x, grid.y, block.x, block.y);hipMemcpy(d_A, h_A, nBytes, hipMemcpyHostToDevice);     hipMemcpy(d_B, h_B, nBytes, hipMemcpyHostToDevice);    hipLaunchKernelGGL(sumArrays, dim3(grid), dim3(block), 0, 0, d_A, d_B, d_C, nElem);     hipMemcpy(h_C, d_C, nBytes, hipMemcpyDeviceToHost);hipEventRecord(start, 0);     hipMemcpy(d_A, h_A, nBytes, hipMemcpyHostToDevice);     hipMemcpy(d_B, h_B, nBytes, hipMemcpyHostToDevice);     hipEventRecord(stop, 0);     hipEventSynchronize(stop);     float memcpy_h2d_time;     hipEventElapsedTime(&memcpy_h2d_time, start, stop);hipEventRecord(start, 0);     hipLaunchKernelGGL(sumArrays, dim3(grid), dim3(block), 0, 0, d_A, d_B, d_C, nElem);     hipEventRecord(stop, 0);     hipEventSynchronize(stop);     float kernel_time;     hipEventElapsedTime(&kernel_time, start, stop);hipEventRecord(start, 0);     hipMemcpy(h_C, d_C, nBytes, hipMemcpyDeviceToHost);     hipEventRecord(stop, 0);     hipEventSynchronize(stop);     float memcpy_d2h_time;     hipEventElapsedTime(&memcpy_d2h_time, start, stop);printf("Measured timings (throughput):\n");     printf(" Memcpy host to device\t: %f ms (%f GB/s)\n", memcpy_h2d_time, (2 * nBytes * 1e-6) / memcpy_h2d_time);     printf(" Memcpy device to host\t: %f ms (%f GB/s)\n", memcpy_d2h_time, (nBytes * 1e-6) / memcpy_d2h_time);     printf(" Kernel time: %f ms\n", kernel_time);     float total_time = memcpy_h2d_time + memcpy_d2h_time + kernel_time;     printf(" Total time: %f ms\n", total_time);//check device results     //checkResult(hostRef, gpuRef, nElem); // free device global memory     hipFree(d_A); hipFree(d_B);     hipFree(d_C);// free host memory     hipHostFree(h_A);     hipHostFree(h_B);     hipHostFree(h_C); hipEventDestroy(start);     hipEventDestroy(stop);hipDeviceReset();     return 0; 
}

2.节点内DCU2DCU带宽测试

#include "hip/hip_runtime.h"
#include "../common/common.h"
#include <stdlib.h>
#include <stdio.h>
#include <hip/hip_runtime.h>/** This example demonstrates P2P ping-ponging of data from one GPU to another,* within the same node. By enabling peer-to-peer transfers, you ensure that* copies between GPUs go directly over the PCIe bus. If P2P is not enabled,* host memory must be used as a staging area for GPU-to-GPU cudaMemcpys.*/__global__ void iKernel(float *src, float *dst)
{const int idx = blockIdx.x * blockDim.x + threadIdx.x;dst[idx] = src[idx] * 2.0f;
}inline bool isCapableP2P(int ngpus)
{hipDeviceProp_t prop[ngpus];int iCount = 0;for (int i = 0; i < ngpus; i++){CHECK(hipGetDeviceProperties(&prop[i], i));if (prop[i].major >= 2) iCount++;printf("> GPU%d: %s %s capable of Peer-to-Peer access\n", i,prop[i].name, (prop[i].major >= 2 ? "is" : "not"));}if(iCount != ngpus){printf("> no enough device to run this application\n");}return (iCount == ngpus);
}/** enable P2P memcopies between GPUs (all GPUs must be compute capability 2.0 or* later (Fermi or later)).*/
inline void enableP2P (int ngpus)
{for( int i = 0; i < ngpus; i++ ){CHECK(hipSetDevice(i));for(int j = 0; j < ngpus; j++){if(i == j) continue;int peer_access_available = 0;CHECK(hipDeviceCanAccessPeer(&peer_access_available, i, j));if (peer_access_available){CHECK(hipDeviceEnablePeerAccess(j, 0));printf("> GPU%d enabled direct access to GPU%d\n", i, j);}else{printf("(%d, %d)\n", i, j );}}}
}inline void disableP2P (int ngpus)
{for( int i = 0; i < ngpus; i++ ){CHECK(hipSetDevice(i));for(int j = 0; j < ngpus; j++){if( i == j ) continue;int peer_access_available = 0;CHECK(hipDeviceCanAccessPeer( &peer_access_available, i, j) );if( peer_access_available ){CHECK(hipDeviceDisablePeerAccess(j));printf("> GPU%d disabled direct access to GPU%d\n", i, j);}}}
}void initialData(float *ip, int size)
{for(int i = 0; i < size; i++){ip[i] = (float)rand() / (float)RAND_MAX;}
}int main(int argc, char **argv)
{int ngpus;// check device countCHECK(hipGetDeviceCount(&ngpus));printf("> CUDA-capable device count: %i\n", ngpus);// check p2p capabilityisCapableP2P(ngpus);// get ngpus from command lineif (argc > 1){if (atoi(argv[1]) > ngpus){fprintf(stderr, "Invalid number of GPUs specified: %d is greater ""than the total number of GPUs in this platform (%d)\n",atoi(argv[1]), ngpus);return 1;}ngpus  = atoi(argv[1]);}if (ngpus < 2){fprintf(stderr, "No more than 2 GPUs supported\n");return 1;}if (ngpus > 1) enableP2P(ngpus);// Allocate buffersint iSize = 1<<24;const size_t iBytes = iSize * sizeof(float);printf("\nAllocating buffers (%iMB on each GPU and CPU Host)...\n",int(iBytes / 1024 / 1024));float **d_src = (float **)malloc(sizeof(float) * ngpus);float **d_rcv = (float **)malloc(sizeof(float) * ngpus);float **h_src = (float **)malloc(sizeof(float) * ngpus);hipStream_t *stream = (hipStream_t *)malloc(sizeof(hipStream_t) * ngpus);// Create CUDA event handleshipEvent_t start, stop;CHECK(hipSetDevice(0));CHECK(hipEventCreate(&start));CHECK(hipEventCreate(&stop));for (int i = 0; i < ngpus; i++){CHECK(hipSetDevice(i));CHECK(hipMalloc(&d_src[i], iBytes));CHECK(hipMalloc(&d_rcv[i], iBytes));CHECK(hipHostMalloc((void **) &h_src[i], iBytes));CHECK(hipStreamCreate(&stream[i]));}for (int i = 0; i < ngpus; i++){initialData(h_src[i], iSize);}// unidirectional gmem copyCHECK(hipSetDevice(0));CHECK(hipEventRecord(start, 0));for (int i = 0; i < 100; i++){if (i % 2 == 0){CHECK(hipMemcpy(d_src[1], d_src[0], iBytes,hipMemcpyDeviceToDevice));}else{CHECK(hipMemcpy(d_src[0], d_src[1], iBytes,hipMemcpyDeviceToDevice));}}CHECK(hipSetDevice(0));CHECK(hipEventRecord(stop, 0));CHECK(hipEventSynchronize(stop));float elapsed_time_ms;CHECK(hipEventElapsedTime(&elapsed_time_ms, start, stop ));elapsed_time_ms /= 100.0f;printf("Ping-pong unidirectional hipMemcpy:\t\t %8.2f ms ",elapsed_time_ms);printf("performance: %8.2f GB/s\n",(float)iBytes / (elapsed_time_ms * 1e6f));//  bidirectional asynchronous gmem copyCHECK(hipEventRecord(start, 0));for (int i = 0; i < 100; i++){CHECK(hipMemcpyAsync(d_src[1], d_src[0], iBytes,hipMemcpyDeviceToDevice, stream[0]));CHECK(hipMemcpyAsync(d_rcv[0], d_rcv[1], iBytes,hipMemcpyDeviceToDevice, stream[1]));}CHECK(hipSetDevice(0));CHECK(hipEventRecord(stop, 0));CHECK(hipEventSynchronize(stop));elapsed_time_ms = 0.0f;CHECK(hipEventElapsedTime(&elapsed_time_ms, start, stop ));elapsed_time_ms /= 100.0f;printf("Ping-pong bidirectional hipMemcpyAsync:\t %8.2fms ",elapsed_time_ms);printf("performance: %8.2f GB/s\n",(float) 2.0f * iBytes / (elapsed_time_ms * 1e6f) );disableP2P(ngpus);// freeCHECK(hipSetDevice(0));CHECK(hipEventDestroy(start));CHECK(hipEventDestroy(stop));for (int i = 0; i < ngpus; i++){CHECK(hipSetDevice(i));CHECK(hipFree(d_src[i]));CHECK(hipFree(d_rcv[i]));CHECK(hipStreamDestroy(stream[i]));CHECK(hipDeviceReset());}exit(EXIT_SUCCESS);
}

在这里插入图片描述

这篇关于HIP技术测试2-CPU2DCU和DCU2DCU带宽测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/355627

相关文章

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

【测试】输入正确用户名和密码,点击登录没有响应的可能性原因

目录 一、前端问题 1. 界面交互问题 2. 输入数据校验问题 二、网络问题 1. 网络连接中断 2. 代理设置问题 三、后端问题 1. 服务器故障 2. 数据库问题 3. 权限问题: 四、其他问题 1. 缓存问题 2. 第三方服务问题 3. 配置问题 一、前端问题 1. 界面交互问题 登录按钮的点击事件未正确绑定,导致点击后无法触发登录操作。 页面可能存在

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

前端技术(七)——less 教程

一、less简介 1. less是什么? less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,增加了变量、Mixin、函数等特性,使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 ,也可以借助Node.js在服务端运行。 less的中文官网:https://lesscss.cn/ 2. less编译工具 koala 官网 http://koala-app.

速盾:直播 cdn 服务器带宽?

在当今数字化时代,直播已经成为了一种非常流行的娱乐和商业活动形式。为了确保直播的流畅性和高质量,直播平台通常会使用 CDN(Content Delivery Network,内容分发网络)服务器来分发直播流。而 CDN 服务器的带宽则是影响直播质量的一个重要因素。下面我们就来探讨一下速盾视角下的直播 CDN 服务器带宽问题。 一、直播对带宽的需求 高清视频流 直播通常需要传输高清视频