CUDA9.0 C++测试程序

2023-11-09

// CUDA runtime 库 + CUBLAS 库   
#include "cuda_runtime.h"  
#include "cublas_v2.h"  

#include <time.h>  
#include <iostream>  

using namespace std;

// 定义测试矩阵的维度  
int const M = 5;
int const N = 10;

int main()
{
	// 定义状态变量  
	cublasStatus_t status;

	// 在 内存 中为将要计算的矩阵开辟空间  
	float *h_A = (float*)malloc(N*M * sizeof(float));
	float *h_B = (float*)malloc(N*M * sizeof(float));

	// 在 内存 中为将要存放运算结果的矩阵开辟空间  
	float *h_C = (float*)malloc(M*M * sizeof(float));

	// 为待运算矩阵的元素赋予 0-10 范围内的随机数  
	for (int i = 0; i < N*M; i++) {
		h_A[i] = (float)(rand() % 10 + 1);
		h_B[i] = (float)(rand() % 10 + 1);

	}

	// 打印待测试的矩阵  
	cout << "矩阵 A :" << endl;
	for (int i = 0; i < N*M; i++) {
		cout << h_A[i] << " ";
		if ((i + 1) % N == 0) cout << endl;
	}
	cout << endl;
	cout << "矩阵 B :" << endl;
	for (int i = 0; i < N*M; i++) {
		cout << h_B[i] << " ";
		if ((i + 1) % M == 0) cout << endl;
	}
	cout << endl;

	/*
	** GPU 计算矩阵相乘
	*/

	// 创建并初始化 CUBLAS 库对象  
	cublasHandle_t handle;
	status = cublasCreate(&handle);

	if (status != CUBLAS_STATUS_SUCCESS)
	{
		if (status == CUBLAS_STATUS_NOT_INITIALIZED) {
			cout << "CUBLAS 对象实例化出错" << endl;
		}
		getchar();
		return EXIT_FAILURE;
	}

	float *d_A, *d_B, *d_C;
	// 在 显存 中为将要计算的矩阵开辟空间  
	cudaMalloc(
		(void**)&d_A,    // 指向开辟的空间的指针  
		N*M * sizeof(float)    // 需要开辟空间的字节数  
	);
	cudaMalloc(
		(void**)&d_B,
		N*M * sizeof(float)
	);

	// 在 显存 中为将要存放运算结果的矩阵开辟空间  
	cudaMalloc(
		(void**)&d_C,
		M*M * sizeof(float)
	);

	// 将矩阵数据传递进 显存 中已经开辟好了的空间  
	cublasSetVector(
		N*M,    // 要存入显存的元素个数  
		sizeof(float),    // 每个元素大小  
		h_A,    // 主机端起始地址  
		1,    // 连续元素之间的存储间隔  
		d_A,    // GPU 端起始地址  
		1    // 连续元素之间的存储间隔  
	);
	cublasSetVector(
		N*M,
		sizeof(float),
		h_B,
		1,
		d_B,
		1
	);

	// 同步函数  
	cudaThreadSynchronize();

	// 传递进矩阵相乘函数中的参数,具体含义请参考函数手册。  
	float a = 1; float b = 0;
	// 矩阵相乘。该函数必然将数组解析成列优先数组  
	cublasSgemm(
		handle,    // blas 库对象   
		CUBLAS_OP_T,    // 矩阵 A 属性参数  
		CUBLAS_OP_T,    // 矩阵 B 属性参数  
		M,    // A, C 的行数   
		M,    // B, C 的列数  
		N,    // A 的列数和 B 的行数  
		&a,    // 运算式的 α 值  
		d_A,    // A 在显存中的地址  
		N,    // lda  
		d_B,    // B 在显存中的地址  
		M,    // ldb  
		&b,    // 运算式的 β 值  
		d_C,    // C 在显存中的地址(结果矩阵)  
		M    // ldc  
	);

	// 同步函数  
	cudaThreadSynchronize();

	// 从 显存 中取出运算结果至 内存中去  
	cublasGetVector(
		M*M,    //  要取出元素的个数  
		sizeof(float),    // 每个元素大小  
		d_C,    // GPU 端起始地址  
		1,    // 连续元素之间的存储间隔  
		h_C,    // 主机端起始地址  
		1    // 连续元素之间的存储间隔  
	);

	// 打印运算结果  
	cout << "计算结果的转置 ( (A*B)的转置 ):" << endl;

	for (int i = 0; i < M*M; i++) {
		cout << h_C[i] << " ";
		if ((i + 1) % M == 0) cout << endl;
	}

	// 清理掉使用过的内存  
	free(h_A);
	free(h_B);
	free(h_C);
	cudaFree(d_A);
	cudaFree(d_B);
	cudaFree(d_C);

	// 释放 CUBLAS 库对象  
	cublasDestroy(handle);

	getchar();

	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CUDA9.0 C++测试程序 的相关文章

  • 为 DocumentDb 设置自定义 json 转换器

    我正在使用类型化 DocumentQuery 从 Azure DocumentDb 集合中读取文档 from f in client CreateDocumentQuery
  • 为什么 std::vector 可以处理类定义中的不完整类型?

    出现了以下问题 C 标准似乎说 std vector需要一个完整的类型才能工作 看https en cppreference com w cpp container vector https en cppreference com w cp
  • 在 LINQ 查询中进行转换

    是否可以在 LINQ 查询中进行强制转换 为了编译器的缘故 下面的代码并不糟糕 但最好将其放入一个查询中 Content content dataStore RootControl as Controls Content List
  • SOAP Web 服务:多台服务器,一个接口

    我有一个场景 需要任意数量的服务器来提供相同的 SOAP Web 服务 我想生成一组代理类 并能够为它们提供一个位置 以便在运行时将它们指向不同的服务器 不幸的是 看起来好像wsdl port节点 子节点wsdl service 要求对特定
  • 如何使用T4从一个模板同时生成两个文件?

    我遇到的情况是 我需要生成两个 CSharp 代码文件 它们的代码几乎相同 但方法的输入和输出类型的命名空间不同 事实上 每个文件都针对特定国家 地区 并且类型来自特定国家 地区的 WSDL 我正在围绕服务编写一些包装器 逻辑完全相同 但从
  • CMake(Ninja 后端)使用 /MT 编译

    我有一个类似的问题CMake 使用 MT 而不是 MD 进行编译 https stackoverflow com questions 14172856 cmake compile with mt instead of md但有一些差异 我正
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 重载算术运算符

    赋值运算符可以声明为 T 运算符 const t 在类中 但不能以这种方式定义算术运算符 它必须是友元函数 我不明白为什么 你能解释一下吗 算术运算符不必须是友元 那么你可以这样定义 MyClass MyClass operator con
  • DateTime.ParseExact - 为什么 yy 变成 2015 而不是 1915

    为什么 NET 假定以下年份是 2015 年 而不是 1915 年 var d DateTime ParseExact 20 11 15 dd MM yy new CultureInfo en GB 我想 它会尝试接近 但其背后是否有合理的
  • MINIX内部碎片2

    我正在用 C 语言编写一些软件 它递归地列出给定目录中的所有文件 现在我需要计算出内部碎片 我花了很长时间研究这个问题 发现 ext2 上的内部碎片只发生在最后一个块中 我知道理论上你应该能够从索引节点号获得第一个和最后一个块地址 但我不知
  • fgets溢出后如何清除输入缓冲区?

    当输入字符串超出其预定义限制时 我遇到了 fgets 的小问题 以下面的例子为例 for index 0 index lt max index printf Enter the d string index 1 if fgets input
  • 为什么这个位图图像在加载后会改变大小?

    快速提问 我有这个1000 1000位图图像 我使用这个例程来加载它 private BitmapSource initialBitmap new BitmapImage new Uri C Users Desktop Original b
  • 如何在VS2005中使用从.bat而不是.exe启动的外部程序进行调试?

    在我的 c 项目的调试属性中 我选择了 启动外部程序 并选择了我希望将调试器附加到的程序的 exe 但是 现在我需要从 bat 文件而不是 exe 启动程序 但 VS2005 似乎不允许这样做 这可能吗 编辑 为了澄清 我需要调试从 bat
  • 具有多个父项的 Qt 树模型

    我想构建一棵树 其中一个元素可以引用另一个元素 我想要构建的树是 像这样的东西 A B C D E F P this is a pointer to C D first child of C E second child of C I fo
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整
  • 尝试后终于没有被调用

    由于某种原因 在我的控制台应用程序中 我无法运行我的finally 块 我编写这段代码是为了测试finally块是如何工作的 所以它非常简单 static void Main int i 0 try int j 1 i Generate a
  • java有类似C#的属性吗? [复制]

    这个问题在这里已经有答案了 C 属性 我的意思是 get 和 set 方法 是一个非常有用的功能 java 也有类似 C 的属性吗 我的意思是我们如何在 java 中实现类似以下 C 代码的内容 public string Name get
  • 如何将模型绑定到动态创建的类 nancyfx

    首先感谢任何愿意查看我的问题的人 我对 Nancyfx 还很陌生 在尝试将 JSON 有效负载绑定到动态创建的类时遇到问题 我按照这篇文章中的代码动态创建了该类 在C 中动态创建一个类 https stackoverflow com que
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem

随机推荐

  • 激光雷达远距离灰尘扬尘烟雾粉尘检测

    最近对激光检测粉尘产生了一点兴趣 于是使用已有的雷达做了检测思路的验证 检测范围可以和雷达的扫描范围一致 约为 0 260m 验证过程使用面粉抛洒 场景如下 红色框就是粉尘的位置 俯视图如下 检测结果如下 绿色范围是检测算法自动框出来的结果
  • 升级Ubuntu18.04的linux kernel(修复小米游戏本的触摸板驱动问题)

    前言 前一段时间换电脑 置换了小米的游戏本 装了ubuntu18 04的系统 demesg发现一直报一个关于i2c接口的错误 473 518316 i2c hid i2c CUST0001 00 i2c hid get input inco
  • 小程序协议篇

    前言 采用的是uniapp的开发框架 引入了mp html的插件做富文本显示插件 操作 打开 富文本编辑 复制粘贴对应的协议文本 直接从word文档或者在线文档复制出来 要带样式的 点击F12或者右键点击检查 进入到Console下面 输入
  • python实现基数排序

    思路 先比较个位数 得到一个新的序列 再按照十位数排序 在上一个新序列的基础上又得到 一个新的序列 然后再按照百位数排序 在上一个新序列的基础上又得到一新的序列 只到排到所有数中的最高位 依次输出列表 排序结束 栗子 例 li 12 90
  • LeetCode 热题 HOT 100:二叉树专题

    LeetCode 热题 HOT 100 https leetcode cn problem list 2cktkvj 文章目录 94 二叉树的中序遍历 递归与非递归 补充 144 二叉树的前序遍历 递归与非递归 补充 145 二叉树的后序遍
  • Spring的Bean生命周期+bean注入+项目启动时正确姿势初始化数据的五种方式

    Spring的Bean生命周期 在Java中万物皆对象 既然是一个实例对象 那么就会有生命历程 被创建 gt 被使用 gt 被销毁 但是这说的太过于简洁了 以至于我们根本不能从本质上认清它具体的执行流程 生命历程 今天就来简单了解下Spri
  • 模型微调fine tune的注意事项以及技巧

    深度学习笔记 一 模型微调fine tune 熊宝宝爱学习的博客 CSDN博客
  • 【Linux】权限管理

    文章目录 1 shell命令以及运行原理 2 Linux权限的概念 3 Linux权限管理 3 1 文件访问者的分类 3 2 文件类型和访问权限 文件类型 file指令 文件权限 4 文件访问权限的设置 4 1 chmod指令 4 2 ch
  • node-red限速分流节点开发

    node red限速分流节点开发 功能简述 节点设计 界面设计 功能设计 功能实现 功能简述 此节点有一个输入 两个输出 此节点可完成信息的限速分流功能 当信息高速输入时 节点进行限速处理 例 两秒一次 到指定时间后信息由一口输出 若未到指
  • ssm整合

    4 2 准备工作 创建Maven Module 导入依赖
  • 泛型深入、自定义泛型、泛型通配符、上下限

    自定义泛型类 泛型类 package Java project 1 import java util ArrayList public class MyArrayList
  • 大数据工程师学习路线,主要划分为哪几个阶段?

    第一阶段 01 Linux学习 02 Java 高级学习 深入理解Java虚拟机 Java高并发实战 第二阶段 03 Hadoop 董西成的书 04 HBase HBase权威指南 05 Hive 06 Scala 07 Spark 08
  • HTTPS 和 OpenSSL 是什么关系?

    HTTPS是一种协议 等于HTTP TLS 由于历史原因 SSL3 0之后就被TLS1 0替代了 openssl是一套开源工具集 主要有两个特性 实现了ssl2 ssl3 TLSv1 TLSv1 1 TLSv1 2协议 实现目前常用的加密算
  • 如何给你的网站套上Cloudflare(以阿里云为例)

    文章目录 Cloudflare 是什么 准备工作 开搞 Cloudflare 设置 阿里云域名设置 等待 设置 DNS 解析记录 其他问题 看下效果 结尾 Cloudflare 是什么 以下内容引自维基百科 Cloudflare是一間總部位
  • HTML5+CSS3实现图片的缩放旋转,一眼就懂

    HTML界面 h2 照片墙 h2 div img src picWallImg 01 jpg width 200px height 150px img src picWallImg 02 jpg width 230px height 180
  • Matlab绘制多函数Bode图

    函数bode用于绘制伯德图 函数logspace用于生成对数刻度的频率点向量 供Bode使用 grid on打印坐标线 上代码 w logspace 1 3 10000 num 10 den 1 1 0 sys tf num den bod
  • 系统改造升级步骤及注意事项(一)

    系统改造升级步骤及注意事项 一 本次系统改造是以汇中综合业务系统中的调度系统 Dispatch 为核心展开的全面升级 以目前市场较为前沿 主流的技术为标准进行改造 为了达到系统性能的提升 实现高并发 高可用以及增强系统可扩展性等目的 目前修
  • 非gui方式配置weblogic数据源和部署war

    weblogic配置Oracle数据源 1 编写脚本和配置文件 创建配置文件server properties domain name 7001 Domain admin url t3 localhost 7001 admin userNa
  • SpringCloud(17~21章):Alibaba入门简介、Nacos服务注册和配置中心、Sentinel实现熔断与限流、Seata处理分布式事务

    17 SpringCloud Alibaba入门简介 17 1 why会出现SpringCloud alibaba Spring Cloud Netflix项目进入维护模式 https spring io blog 2018 12 12 s
  • CUDA9.0 C++测试程序

    CUDA runtime 库 CUBLAS 库 include cuda runtime h include cublas v2 h include