一、概述

最近在试图进行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. 1.appium介绍

    appium介绍 官方网站 1.特点 appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web应用和混合应用. “移动原生应用”是指那些用iOS或者 An ...

  2. 从产品展示页面谈谈Hybris的特有概念和设计结构

    今天这篇文章来自我的同事,SAP成都研究院Hybris开发团队的开发人员Zhang Jonathan(张健).需要特别介绍的是,张健和成都研究院的其他开发同事不同,张健毕业于电子科技大学,读的专业是英 ...

  3. C语言 指向函数的指针

    #include <stdio.h> int sum(int a, int b) { int c = a + b; printf("%d + %d = %d\n", a ...

  4. libevent将信号封装为socket通知的核心代码

    #include"stdafx.h" #include"iostream" #include "algorithm" #include&qu ...

  5. DSL-领域特定语言(英语:domain-specific language、DSL)

    领域特定语言(英语:domain-specific language.DSL)指的是专注于某个应用程序领域的计算机语言.

  6. POSIX 线程详解(经典必看)

    http://www.cnblogs.com/sunminmin/p/4479952.html 总共三部分: 第一部分:POSIX 线程详解                               ...

  7. Codeforces Round #431 (Div. 2)

    A. Odds and Ends Where do odds begin, and where do they end? Where does hope emerge, and will they e ...

  8. [19/03/17-星期日] 常用类_Calendar日历类&GregorianCalendar公历日历类

    一.概念 Calendar 类是一个抽象类,为我们提供了关于日期计算的相关功能,比如:年.月.日.时.分.秒的展示和计算. GregorianCalendar 是 Calendar 的一个具体子类,提 ...

  9. 应用性能指数(APDEX)是如何计算出来的?

    应用性能指数(APDEX)是如何计算出来的?在应用性能管理领域聚合指标是一种常见手段,主要是用来把成百上千的指标通过某种计算方法聚合成一个或几个指标,用来反映应用的整体健康状态.在这些聚合指标中,比较 ...

  10. 2018.11.7 关于将Web项目部署到阿里云服务器-5个步骤搞定

    将Eclipse导出的War包部署到阿里云服务器上,提供给移动端实时的访问 1. 先登录阿里云网站注册账号,选择服务器类型(我用的是 云服务器ECS), 如果你还是在读大学生可享受优惠价,最低好像是9 ...