首页 > 其他分享 >cuda core实现两个128x128 float矩阵乘法demo

cuda core实现两个128x128 float矩阵乘法demo

时间:2024-10-20 20:11:06浏览次数:7  
标签:real core golden demo float vs __ 128

#include <stdio.h>
#include <cuda_runtime.h>

// 128 x 128 -> 
__global__ void mm(float* a, float* b, float* c) {
  // 8 x 8个方块,每个方块16x16
  extern __shared__ float buf[];
  float* a_local = buf;
  float* b_local = buf + 16*128;
  for(int i=0; i<8; i++) {
    a_local[threadIdx.x + i*16 + threadIdx.y*128] = a[threadIdx.x + i*16 + threadIdx.y*128 + blockIdx.y*128*16];
    b_local[(threadIdx.y + i*16)*16 + threadIdx.x] = b[(threadIdx.y + i*16)*128 + threadIdx.x + blockIdx.x*16];
  }
  __syncthreads();
  float tmp = 0.0f;
  for(int k=0; k<128; k++) tmp += a_local[threadIdx.y*128+k]*b_local[k*16+threadIdx.x];
  c[(blockIdx.y*16+threadIdx.y)*128+blockIdx.x*16+threadIdx.x] = tmp;
}

#define CHECK_ERROR(expr) { \
	cudaError_t err = expr; \
	if(err != cudaSuccess) { \
		fprintf(stderr, "[Error] %s:%d %s\n", __FILE__, __LINE__, cudaGetErrorString(err)); \
	} \
}

#define A(i,j) a[i*128+j]
#define B(i,j) b[i*128+j]
#define C(i,j) c[i*128+j]
#define G(i,j) golden[i*128+j]

int main() {
	// int deviceId = 0;
	// CHECK_ERROR(cudaSetDevice(deviceId));
	constexpr size_t size = 128*128*sizeof(float);
	float* a = (float*)malloc(size);
	float* b = (float*)malloc(size);
	float* c = (float*)malloc(size);
	float* golden = (float*)malloc(size);


    // generate input data and golden
	for(int i=0; i<128; i++) {
		for(int j=0; j<128; j++) {
			A(i,j) = (float)(random()%1024);
			B(i,j) = (float)(random()%1024);
		}
	}

	for(int i=0; i<128; i++) {
		for(int j=0; j<128; j++) {
			G(i,j) = 0.0f;
			for(int k=0; k<128; k++) {
				G(i,j) += A(i,k)*B(k,j);
			}
		}
	}

	float *a_d, *b_d, *c_d;
	CHECK_ERROR(cudaMalloc((void**)&a_d, size));
	CHECK_ERROR(cudaMalloc((void**)&b_d, size));
	CHECK_ERROR(cudaMalloc((void**)&c_d, size));
    cudaStream_t stream;
    CHECK_ERROR( cudaStreamCreate(&stream) );
	CHECK_ERROR( cudaMemcpy(a_d, a, size, cudaMemcpyHostToDevice) );
	CHECK_ERROR( cudaMemcpy(b_d, b, size, cudaMemcpyHostToDevice) );
    
	mm<<<dim3(8,8,1), dim3(16, 16, 1), 16*128*2*4, stream>>>(a_d, b_d, c_d);
	{
		cudaError_t err = cudaGetLastError();
		if(err!=cudaSuccess) {
			fprintf(stderr, "[Error] %s:%d %s\n", __FILE__, __LINE__, cudaGetErrorString(err));
		}
	}
	
	CHECK_ERROR(cudaMemcpy(c, c_d, size, cudaMemcpyDeviceToHost));
    CHECK_ERROR( cudaStreamSynchronize(stream) );
	//check result
	float res = 0.0f;
	for(int i=0; i<128; i++) 
		for(int j=0; j<128; j++) res += fabs(G(i,j) - C(i,j));
    for(int i=0; i<10; i++) 
        printf("golden[%d]: %f vs real[%d]: %f \n", i, golden[i], i, c[i]);

	if(res < 1.0e-2) printf("test pass!\n");
    else {
        printf("test fail! res = %f\n", res);
    }
        

    free(a); free(b); free(c); free(golden);
    cudaFree(a_d); cudaFree(b_d); cudaFree(c_d);
	return 0;
}

采用8x8的block, 每个block中完成c矩阵中16x16
编译执行结果。

$ nvcc mmad.cu -Xptxas -v 
$ ./a.out
golden[0]: 32589786.000000 vs real[0]: 32589786.000000 
golden[1]: 38473160.000000 vs real[1]: 38473160.000000 
golden[2]: 30227116.000000 vs real[2]: 30227116.000000 
golden[3]: 28977550.000000 vs real[3]: 28977550.000000 
golden[4]: 34897048.000000 vs real[4]: 34897048.000000 
golden[5]: 36245064.000000 vs real[5]: 36245064.000000 
golden[6]: 31798204.000000 vs real[6]: 31798204.000000 
golden[7]: 30707464.000000 vs real[7]: 30707464.000000 
golden[8]: 34893612.000000 vs real[8]: 34893612.000000 
golden[9]: 36354168.000000 vs real[9]: 36354168.000000 
test pass!

标签:real,core,golden,demo,float,vs,__,128
From: https://www.cnblogs.com/zwlwf/p/18487780

相关文章

  • .netcore 使用PdfSharpCore生成pdf
    想实现的功能是pdf+签名图片合并起来,后面看到了免费开源的PdfSharpCore. 先安装 publicstaticclassPdfSharpCoreHelper{privatestaticstringGetOutFilePath(stringname){stringOutputDirName=@".";return......
  • ASP.NET Core中的Cookie与Session管理:构建高效的辅助类
    Cookie和Session不一样,它们在Web开发中扮演着不同的角色,但经常协同工作以维持和管理Web应用的会话状态。以下是它们之间的主要区别和联系,以及相关的Helper工具介绍。Cookie和Session的区别存放位置:Cookie:保存在客户端的浏览器上。Session:保存在服务器端。存放形式:Coo......
  • 乘风破浪,遇见最佳跨平台跨终端框架.Net Core/.Net生态 - 开源数学库Math.NET,替代Matla
    Math.NEThttps://www.mathdotnet.comMath.NET是一个广泛使用的开源数学库,专为.NET语言(如C#和F#)设计,提供了各种高性能的数学和统计计算功能。它帮助开发者进行线性代数、统计分析、随机数生成、微积分、优化和信号处理等计算,尤其在科学计算、工程应用以及数据分析中被广泛使......
  • netcore grpc
    netcoregrpc一、solution创建空解决方案>dotnetnewsln-nApricot.Grpc二、Grpc.Server创建Apricot.Grpc类库项目>dotnetnewclasslib-nApricot.Grpc#解决方案添加类库项目>dotnetslnaddApricot.Grpc/Apricot.Grpc.csproj安装依赖>dotnetaddp......
  • 【rCore OS 开源操作系统】Rust 智能指针
    前置知识点何为“智能”在Rust中,“智能指针”是指那些实现了特定智能行为的指针类型。这些智能行为通常包括内存管理、生命周期跟踪以及所有权转移等。常见智能指针BoxBox<T>是Rust中最简单的智能指针类型之一,它用于堆分配的内存。Box<T>允许你在堆上分配类型T......
  • C#/.NET/.NET Core学习路线集合,学习不迷路!
    前言C#、.NET、.NETCore、WPF、WinForm、Unity等相关技术的学习、工作路线集合(持续更新)!!!全面的C#/.NET/.NETCore学习、工作、面试指南:https://github.com/YSGStudyHards/DotNetGuideC#/.NET/.NETCore学习路线集合语雀访问地址:https://www.yuque.com/ysgstudyhard/lg56l0/ub8......
  • 并发请求太多,服务器崩溃了?试试使用 ASP.NET Core Web API 操作筛选器对请求进行限流
    前言请求限流(RateLimiting)主要是一种用于控制客户端对服务器的请求频率的机制。其目的是限制客户端在一定时间内可以发送的请求数量,保护服务器免受过多请求的影响,确保系统的稳定性和可靠性。请求限流通常会基于以下几个因素来进行限制:时间窗口:规定了在多长时间内允许的请求......
  • 详细分析 Spring CORS 配置 (附Demo)
    目录前言1.基本知识2.Demo前言基本的Java知识推荐阅读:java框架零基础从入门到精通的学习路线附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新)原先写过一篇跨域的基本知识:Springboot处理跨域的方式(附Demo)1.基本知识CorsRegistry是Spring框架......
  • Tomcat10JdbcPoolDemo
    packagecom.renguanyu.demo;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.Statement;importorg.apache.tomcat.jdbc.pool.DataSource;importorg.apache.tomcat.jdbc.pool.PoolProperties;publicclassTomcat10JdbcPoolDemo{ public......
  • ASP.NET Core PDF viewers components Crack
    ASP.NETCorePDFviewerscomponentsCrackASP.NETCorePDFviewerscomponentswithformfillingsupportletusersdirectlycomplete,edit,andsubmitdatawithinPDFforms.TheabilitytoreadandwriteformfieldsinaPDFviewercomponenten......