一、概述

最近在试图进行cuda并行编程,目标是编写一段矩阵计算代码,将计算结果存储进入GPU的缓冲区当中,并在达到某些要求后强制刷新缓冲区,取得计算结果。

但是考虑时间紧任务重的状况和实际的性能要求,决定使用cublas进行矩阵计算。

本篇文章试图记录我在进行cublas实验时得出的一些结论和一些心得。

二、具体内容

环境和配置

对于在win系统上进行cublas实验需要安装cuda、vs2013+版本。安装过程不再赘述,值得注意的在之后新建项目,引入的头文件应当是cublas_v2,在该头文件下的矩阵计算函数包含了cublas_handle_t的首个参数,是大多是找得到的教程当中要求的函数。

在新建工程之后,如果直接使用cublas的函数进行计算则有一定几率出现error LNK2001——无法解析的外部符号。此时的解决方案大致为两部:1、在项目的链接器配置中加入cudatookit当中的lib文件夹下的所有文件;2之后将该文件夹的路径显式的加入链接器输入的外部库道中。具体过程建议参见:https://blog.csdn.net/xianhua7877/article/details/80792027

值得注意的一点是,该博客提到的一堆lib文件中,由于版本不同可能有的存在于实际目录下,而有的不存在于实际目录下,因此应当在配置结束后删除不存在的文件引用。(查找的方法推荐直接编译运行文件,之后查看报错去除不存在的文件)。

使用cublas计算的基本流程

1、应当建立cublas句柄(handle),用于进行cublas计算

2、应当将待计算数据在内存中准备好(最终表现形式应当为一维数组)

3、应当将在设备端(通常指显卡)中准备相应大小的内存,应当使用命令cudaMolloc(最终表现形式应当为一维数组)

4、应当将内存中的数据传输到设备端,使用命令视类型而有不同,例如,准备的数据类型为矩阵时应当使用命令cublasSetMatrix

5、应当使用cuda计算函数进行计算,并将结果保存在设备端的有效内存中。

6、最终将计算结果传输回到设备端进行回收。

值得注意的是,对于一个矩阵,常规写法和C对于二维数组的写法实际上是按照行优先的形式进行存储的。然而考虑BLAS的历史,最早是为了支持F语言的矩阵运算,因此使用了列优先的存储方式。

因此对于一个矩阵元素的寻址通常使用宏定义的形式定义列优先的寻址方式。例如:
#define idx(x,y,m) (x + (y*m))
在进行矩阵计算时的,有一个参数ldx(x通常为'A'或'B'),该参数实际上指的就是在列优先(或行优先)的情况下,一列(或一行)的元素个数。全称是(leading dimension)即主维,并非cublas独有的一个概念。

CUBLAS基础实验的更多相关文章

  1. [nRF51822] 12、基础实验代码解析大全 · 实验19 - PWM

    一.PWM概述: PWM(Pulse Width Modulation):脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形. PWM 的几个基本概念: 1) 占空比:占空比是指 ...

  2. [nRF51822] 11、基础实验代码解析大全 · 实验16 - 内部FLASH读写

     一.实验内容: 通过串口发送单个字符到NRF51822,NRF51822 接收到字符后将其写入到FLASH 的最后一页,之后将其读出并通过串口打印出数据. 二.nRF51822芯片内部flash知识 ...

  3. [nRF51822] 10、基础实验代码解析大全 · 实验15 - RTC

    一.实验内容: 配置NRF51822 的RTC0 的TICK 频率为8Hz,COMPARE0 匹配事件触发周期为3 秒,并使能了TICK 和COMPARE0 中断. TICK 中断中驱动指示灯D1 翻 ...

  4. [nRF51822] 9、基础实验代码解析大全 · 实验12 - ADC

    一.本实验ADC 配置 分辨率:10 位. 输入通道:5,即使用输入通道AIN5 检测电位器的电压. ADC 基准电压:1.2V. 二.NRF51822 ADC 管脚分布 NRF51822 的ADC ...

  5. [nRF51822] 8、基础实验代码解析大全 · 实验11 - PPI

    前一篇分析了前十个基础实验的代码,从这里开始分析后十个~ 一.PPI原理: PPI(Programmable Peripheral Interconnect),中文翻译为可编程外设互连. 在nRF51 ...

  6. 20145338 《网络对抗》逆向及Bof基础实验

    逆向及Bof基础实验 实践目标 ·本次实践的对象是一个名为pwn1的linux可执行文件. ·该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串. ·该程序同时包含 ...

  7. 20155209林虹宇逆向及Bof基础实验报告

    20155209林虹宇逆向及Bof基础实验报告 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符 ...

  8. 2017-2018-2 20155231《网络对抗技术》实验八: WEB基础实验

    2017-2018-2 20155231<网络对抗技术>实验八:Web基础 实验要求: Web前端HTML(0.5分) 能正常安装.启停Apache.理解HTML,理解表单,理解GET与P ...

  9. 20145332卢鑫 WEB安全基础实验

    20145332 WEB安全基础实验 实验过程 ·SQL字符串注入 ·Database Backdoors step1 ·Database Backdoors step2 ·Phishing with ...

随机推荐

  1. 再学UML-深入浅出UML类图(五)

    实例分析3——售票机控制程序 某运输公司决定为新的售票机开发车票销售的控制软件.图I给出了售票机的面板示意图以及相关的控制部件. 图I   售票机面板示意图 售票机相关部件的作用如下所述: (1) 目 ...

  2. 【Hibernate那点事儿】—— Hibernate应该了解的知识

    前言: 最近由于有点时间,就像深入的学习一下Hibernate.之前只是简单的使用,并没领会它的妙处.这里就趁着分享的机会,好好整理一下. 这篇主要讲到了下面几个部分: Hibernate框架 Hib ...

  3. nodejs理解

    一.nodejs介绍 nodejs主要体现在事件机制和异步IO,nodejs是事件驱动的: nodejs作用:js的运行环境.操作文件.链接数据库: nodejs在执行js是单线程的,但不是nodej ...

  4. 如何使用Kubernetes里的NetworkPolicy

    创建一个类型为NetworkPolicy的Kubernetes对象的yaml文件. 第九行的podSelector指定这个NetworkPolicy施加在哪些pod上,通过label来做pod的过滤. ...

  5. IOS UIImagePickerController(拍照或者读取相册)

      UIImagePickerController ● 使用UIImagePickerController就可以进行拍照或者读取相册 ● 通过sourceType属性来决定拍照还是读取相册 ➢ UII ...

  6. 20165322 实验一 Java开发环境的熟悉

    实验一 Java开发环境的熟悉 一.实验内容及步骤 (一)命令行下Java程序开发 按照步骤新建目录.键入代码,再编译运行输出.运行结果和TREE结构图如下: (二) IDEA下Java程序开发.调试 ...

  7. python:常用模块一

    一.collections模块 1,在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter.deque.defaultd ...

  8. HDU 1754 I Hate It 【线段树单点修改 维护区间最大值】

    题目传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1754 I Hate It Time Limit: 9000/3000 MS (Java/Others ...

  9. HDU 2199 Can you solve this equation?(二分解方程)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2199 Can you solve this equation? Time Limit: 2000/10 ...

  10. Rest API 开发 学习笔记

    概述 REST 从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表示方式.获得这些表徵致使这些应用程序转变了其状态.随着不断获取资源的表示方式,客户端应用 ...