一、概述

最近在试图进行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. ZooKeeper 典型应用场景-Master选举

    master选举 1.使用场景及结构 现在很多时候我们的服务需要7*24小时工作,假如一台机器挂了,我们希望能有其它机器顶替它继续工作.此类问题现在多采用master-salve模式,也就是常说的主从 ...

  2. Android获取手机安装的浏览器列表

    最近碰到一个同事询问如何查询本地安装的浏览器列表,其使用的代码如下: public static List<ResolveInfo> getBrowserList(Context cont ...

  3. 【CF1009F】Dominant Indices(长链剖分优化DP)

    点此看题面 大致题意: 设\(d(x,y)\)表示\(x\)子树内到\(x\)距离为\(y\)的点的个数,对于每个\(x\),求满足\(d(x,y)\)最大的最小的\(y\). 暴力\(DP\) 首先 ...

  4. 【[SDOI2013]随机数生成器】

    题目 来画柿子吧 我们要求的是 \[f(x)\equiv t(mod\ \ p)\] 其中\(f(1)=x_0,f(x)=af(x-1)+b\) 我们来写几项柿子看看 \[f(1)=x_0\] \[f ...

  5. bzoj 2434 [Noi2011]阿狸的打字机——AC自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2434 dfs AC自动机,走过的点权值+1,回溯的时候权值-1:走到询问的 y 串的节点,看 ...

  6. [19/03/13-星期三] 数组_二维数组&冒泡排序&二分查找

    一.二维数组 多维数组可以看成以数组为元素的数组.可以有二维.三维.甚至更多维数组,但是实际开发中用的非常少.最多到二维数组(我们一般使用容器代替,二维数组用的都很少). [代码示例] import ...

  7. Ajax综合应用大全(全面解析)

      AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 JavaScrip ...

  8. 【luogu P3950 部落冲突】 题解

    题目连接:https://www.luogu.org/problemnew/show/P3950 1.像我这种学数据结构学傻了的 2.边权化点权 所有点权初始化0 3.对于战争 将深度较深的-1,对于 ...

  9. 【Linux-CentOS】【转-更正】使用CentOS DVD1 和DVD2做本地yum源

    原文在此.此文写的非常好,怕网络丢失,特转来,并做了更正. CentOS6以上版本一般都会提供一个DVD1和一个DVD2镜像,使用DVD1即可安装使用CentOS了,DVD2中存放了一些额外的软件包, ...

  10. java容易混淆的的内部类相关概念

    关于内部类: 作用: 1. 内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类 2. 内部类的方法可以直接访问外部类的所有数据,包括私有的数据 3. 内部类所实现的 ...