摘要:
▶ 问题:给定一个数组 nums 及一个目标值 target,求数组中是否存在 n 项的和恰好等于目标值 ▶ 第 1题,n = 2,要求返回解 ● 代码,160 ms,穷举法,时间复杂度 O(n2),空间复杂度 O(1) ● 代码,9 ms,排序后夹逼,需要构造一个结构来保存下标,连着下标一起排序。 阅读全文
posted @ 2018-01-03 23:02
爨爨爨好
阅读(263)
评论(0)
推荐(0)
|
摘要:
▶ 问题:给定一个数组 nums 及一个目标值 target,求数组中是否存在 n 项的和恰好等于目标值 ▶ 第 1题,n = 2,要求返回解 ● 代码,160 ms,穷举法,时间复杂度 O(n2),空间复杂度 O(1) ● 代码,9 ms,排序后夹逼,需要构造一个结构来保存下标,连着下标一起排序。 阅读全文
posted @ 2018-01-03 23:02
爨爨爨好
阅读(263)
评论(0)
推荐(0)
摘要:
▶ 问题:求两个已经排好序的数组的中位数。 ▶ 简单的归并版。现将两个数组一趟归并到一个数组中(O(m+n)),再利用新数组长度的奇偶性计算新数组的中位数(O(1)),总体时间复杂度 O(m+n),空间复杂度 O(m+n)。 ● 代码,79 ms ▶ 高端的分组分段法,时间复杂度 O(log(min 阅读全文
posted @ 2017-12-27 22:49
爨爨爨好
阅读(309)
评论(0)
推荐(0)
摘要:
▶ 问题:判断一个字符串是否能通过删除至多一个字符来变成回文串。 ▶ 算法: ● 使用两个指针,开始时分别指向字符串的首元素和末元素,进行回文检查。若检查到两指针重叠或交换,则说明输入字符串已经是回文,返回正确。 ● 若检查到中间某一位置时发现两指针指向的元素不相等,则假设这两个元素之一是多余的元素 阅读全文
posted @ 2017-12-27 21:10
爨爨爨好
阅读(141)
评论(0)
推荐(0)
摘要:
▶ 问题:给定数组 { ai,i = D1n },求 ( j - i ) * | aj - ai | 的最大值。 ▶ 算法:考虑 ai 和 ai+1,若 ai ≥ ai+1 则显然选 ai 比选 ai+1 更好;若 ai < ai+1,则我们需要比较 ( j - i ) * | aj - ai | 阅读全文
posted @ 2017-12-27 21:02
爨爨爨好
阅读(165)
评论(0)
推荐(0)
摘要:
使用 Runtime API 和 Driver API 检测设备相关属性。并检测了设备之间的拓扑以及主机与设备之间的拓扑(是否支持跨设备原子操作)。 ▶ 源代码:Runtime API ▶ 输出结果: ▶ 源代码:Driver API ▶ 输出结果: ▶ 源代码:topologyQuery ▶ 输出 阅读全文
posted @ 2017-12-14 21:19
爨爨爨好
阅读(776)
评论(0)
推荐(0)
摘要:
使用三种模式(QUICK_MODE,RANGE_MODE,SHMOO_MODE),测试三种拷贝情况下的显存带宽(HostToDevice,DeviceToHost,DeviceToDevice) ▶ 源代码 ▶ 输出结果:QUICK_MODE,是否写入合并都尝试了。 ▶ 输出结果:SHMOO_MOD 阅读全文
posted @ 2017-12-14 19:59
爨爨爨好
阅读(1201)
评论(0)
推荐(0)
摘要:
▶ 数学函数 ● 舍入函数,考虑被舍入参数有双精度浮点和单精度浮点,舍入方式有区别,舍入结果有整形、长整形和长长整形,所以共有以下舍入函数。 ● 推荐单精度浮点使用函数 rint() 系列(单指令计算),而不用函数 round() 系列(8 指令计算)。其他几个用于单精度浮点的舍入函数也是单指令计算 阅读全文
posted @ 2017-12-11 00:32
爨爨爨好
阅读(461)
评论(0)
推荐(0)
摘要:
▶ 协作组,要求 cuda ≥ 9.0,一个简单的例子见 http://www.cnblogs.com/cuancuancuanhao/p/7881093.html ● 灵活调节需要进行通讯的线程组合(不一定是线程块或是线程束)的尺寸,在更多粒度上进行线程协作。 ● 协作组功能支持 CUDA 的各种 阅读全文
posted @ 2017-12-11 00:24
爨爨爨好
阅读(1033)
评论(0)
推荐(0)
摘要:
▶ 简单的将纯 C/C++ 函数放到另一个文件中,利用头文件引用到主体 .cu 中来,编译时共同编译。 ▶ 源代码,把 C++ 的部分去掉了 ● 输出结果: ▶ 涨姿势 阅读全文
posted @ 2017-12-09 23:24
爨爨爨好
阅读(273)
评论(0)
推荐(0)
摘要:
▶ 使用 CUDA Runtime API,运行时编译,Driver API 三种接口计算向量加法 ▶ 源代码,CUDA Runtime API ● 输出结果: ▶ 源代码,运行时编译 ● 输出结果: ▶ 源代码,Driver API,也需要上面的 vectorAdd_kernel.cu,调用核函数 阅读全文
posted @ 2017-12-09 19:51
爨爨爨好
阅读(453)
评论(0)
推荐(0)
摘要:
使用 OpenMP 和 pthreads 两种环境,利用实现统一内存编址,计算基本的矩阵乘法 result = α * A * x + β * result 。 ▶ 源代码 ▶ 输出结果:OpenMP ▶ 输出结果:pthreads ▶ 涨姿势: ● 使用 C++ 结构体完成了类似类的方法。即在结构 阅读全文
posted @ 2017-12-09 19:21
爨爨爨好
阅读(534)
评论(0)
推荐(0)
摘要:
简单的 CUDA 应用模板,白送的 Sample。 ▶ 源代码 ▶ 输出结果: ▶ 涨姿势:没有 阅读全文
posted @ 2017-12-09 12:44
爨爨爨好
阅读(309)
评论(0)
推荐(0)
摘要:
两种方法使用零拷贝内存做简单的向量加和,并评估 GPU 计算结果与 CPU 计算结果的差。 ▶ 源代码 ▶ 输出结果: ▶ 涨姿势 ● 两种使用零拷贝内存的方法,在代码的逻辑部分进行了说明 ● 向上取整的宏函数,只对分母(size)为 2 的整数次幂的情况有效。 e.g. size == 4096, 阅读全文
posted @ 2017-12-09 12:20
爨爨爨好
阅读(473)
评论(0)
推荐(0)
摘要:
介绍了线程束表决函数的实例(其概念介绍见 http://www.cnblogs.com/cuancuancuanhao/p/7841512.html),并在静态和运行时编译两种条件下进行使用。 ▶ 源代码:静态 ▶ 输出结果: ▶ 源代码:运行时编译(删掉了相同的注释) ▶ 输出结果: ▶ 涨姿势 阅读全文
posted @ 2017-12-09 00:51
爨爨爨好
阅读(406)
评论(0)
推荐(0)
摘要:
使用纹理引用来旋转图片,并在使用了静态编译和运行时编译两种环境。 ▶ 源代码:静态编译 ▶ 输出结果 ▶ 源代码:运行时编译 ▶ 输出结果: ▶ 涨姿势 ● 一般,与 0_Simple__simpleSurfaceWrite 类似。 阅读全文
posted @ 2017-12-03 01:16
爨爨爨好
阅读(462)
评论(0)
推荐(0)
摘要:
使用 C++ 的模板 ▶ 源代码:静态使用 ▶ 输出结果: ▶ 源代码:使用运行时编译 ▶ 输出结果: ▶ 涨姿势 ● 封装了 SharedMemory,ArrayComparator,ArrayFileWriter 三个模板,并定义了其在不同的数据类型下的实现。 阅读全文
posted @ 2017-12-02 22:59
爨爨爨好
阅读(247)
评论(0)
推荐(0)
摘要:
使用表面写入函数,结合纹理引用实现图片的旋转▶ 源代码 ▶ 输出结果 ▶ 涨姿势 ● 使用函数 sdkLoadPGM() 读取图片数据 ● 使用到的表面写入函数原型 阅读全文
posted @ 2017-12-01 00:42
爨爨爨好
阅读(538)
评论(0)
推荐(0)
摘要:
对比使用单流和多流(4条)情况下数据拷贝,以及数据拷贝加内核调用的效率差别。▶ 源代码 ▶ 输出结果 ▶ 涨姿势 ● 涉及的宏和内部函数原型 ● 使用原生页对齐锁定内存的步骤 ● 使用函数 cudaEventCreateWithFlags() 相关来计时,与之前的函数 cudaEventCreate 阅读全文
posted @ 2017-11-30 23:16
爨爨爨好
阅读(619)
评论(0)
推荐(0)
摘要:
把代码文件和主程序文件分开编译,使用头文件的形式进行引用。 ▶ 源代码 ▶ 输出结果 未测试 ▶ 涨姿势 ●写在其他 .cpp 文件中的设备函数,需要用函数 cudaMemcpyFromSymbol() 放入设备常量内存才能使用。 阅读全文
posted @ 2017-11-25 16:06
爨爨爨好
阅读(209)
评论(0)
推荐(0)
摘要:
在设备代码中使用函数 printf(),没有新的认识。 ▶ 源代码 ▶ 输出结果 阅读全文
posted @ 2017-11-25 15:08
爨爨爨好
阅读(227)
评论(0)
推荐(0)
摘要:
对比设备线性二维数组和 CUDA 二维数组在纹理引用中的效率 ▶ 源代码。分别绑定相同大小的设备线性二维数组和 CUDA 二维数组为纹理引用,做简单的平移操作,重复若干次计算带宽和访问速度。 ▶ 输出结果 ▶ 涨姿势 ● 用到的函数都在以前的,有关线性二维数组和纹理内存使用方法的博客汇总讨论过了。 阅读全文
posted @ 2017-11-25 13:06
爨爨爨好
阅读(398)
评论(0)
推荐(0)
摘要:
使用 P2P 特性在 GPU 之间传输、读写数据。 ▶ 源代码。包括 P2P 使用前的各项检查,设备之间的数据互拷,主机和设备之间数据传输和相互访问。 ▶ 输出结果 只有一台设备,暂无法进行测试 ▶ 涨姿势: ● P2P 要求:至少两台计算能力不低于 2.0 的设备,并支持同一可视内存空间特性;计算 阅读全文
posted @ 2017-11-25 12:01
爨爨爨好
阅读(813)
评论(0)
推荐(0)
摘要:
计算核函数调用使得占用率,并尝试使用 runtime 函数自动优化线程块尺寸,以便提高占用率。 ▶ 源代码。 ▶ 输出结果 ▶ 涨姿势 ● 用到的几个 runtime 函数及其相互关系。 阅读全文
posted @ 2017-11-25 10:30
爨爨爨好
阅读(716)
评论(0)
推荐(0)
摘要:
使用多台 GPU 进行计算▶ 源代码。使用不同的流来控制不同 GPU 上的运算任务。 ▶ 输出结果 ▶ 涨姿势 ● 在使用不同的设备执行相关函数(包括 cudaFree 等主机函数)时要注意,使用函数 cudaSetDevice() 来切换设备。 阅读全文
posted @ 2017-11-23 12:30
爨爨爨好
阅读(353)
评论(0)
推荐(0)
摘要:
利用 CUDA 的 Overlap 特性同时进行运算和数据拷贝来实现加速。 ▶ 源代码。使用 4 个流一共执行 10 次 “数据上传 - 内核计算 - 数据下载” 过程,记录使用时间。 ▶ 输出结果 ▶ 涨姿势 ● 没有 阅读全文
posted @ 2017-11-23 11:12
爨爨爨好
阅读(681)
评论(0)
推荐(0)
摘要:
MPI 的简单使用▶ 源代码。主机根结点生成随机数组,发布副本到各结点(例子用孩子使用了一个结点),分别使用 GPU 求平方根并求和,然后根结点使用 MPI 回收各节点的计算结果,规约求和后除以数组大小(相当于球随机数组中所有元素的平方根的平均值)。 ▶ 输出结果 ▶ 涨姿势 ● 集中在 MPI 的 阅读全文
posted @ 2017-11-23 10:01
爨爨爨好
阅读(521)
评论(0)
推荐(0)
摘要:
二维分层纹理 ▶ 源代码。用纹理方法把元素按原顺序从 CUDA3D 数组中取出来,求个相反数再加上层数放入全局内存,输出。 ▶ 输出结果 ▶ 涨姿势 ● 与前面立方体贴图纹理不同的地方:申请 CUDA3D 数组的时候使用标志 cudaArrayLayered 而不是 cudaArrayCubemap 阅读全文
posted @ 2017-11-22 23:49
爨爨爨好
阅读(273)
评论(0)
推荐(0)
摘要:
立方体纹理贴图 ▶ 源代码。用纹理方法把元素按原顺序从 CUDA3D 数组中取出来,求个相反数放入全局内存,输出。 ▶ 输出结果 ▶ 涨姿势 ● helper_time.h 中新定义的计时函数 ● 立方体纹理贴图。六个面分别为 x = 1 正面、x = -1 轴负面、y = 1 正面、y = -1 阅读全文
posted @ 2017-11-22 22:45
爨爨爨好
阅读(340)
评论(0)
推荐(0)
摘要:
▶ 协作组,CUDA9.0 的新特性 挂白痴:https://blog.csdn.net/bruce_0712/article/details/79116013 ▶ 源代码,如何获得协作组的编号? 1 #include <stdio.h> 2 #include "cuda_runtime.h" 3 阅读全文
posted @ 2017-11-22 20:21
爨爨爨好
阅读(806)
评论(0)
推荐(0)
摘要:
▶ 线程束表决函数(Warp Vote Functions) ● 用于同一线程束内各线程通信和计算规约指标。 ● 在设备代码的一个线程中调用 _all(predicate),__any(mask, predicate),__ballot(mask, predicate) 时,该线程所在的线程束中所有 阅读全文
posted @ 2017-11-15 23:09
爨爨爨好
阅读(4204)
评论(0)
推荐(0)
摘要:
▶ 可缓存只读操作(Read-Only Data Cache Load Function),定义在 sm_32_intrinsics.hpp 中。从地址 adress 读取类型为 T 的函数返回,T 可以是 char,short,int,long longunsigned char,unsigned 阅读全文
posted @ 2017-11-15 21:16
爨爨爨好
阅读(999)
评论(0)
推荐(0)
摘要:
▶ 纹理内存读取函数 ▶ 表面内存读写函数 阅读全文
posted @ 2017-11-12 00:32
爨爨爨好
阅读(776)
评论(0)
推荐(0)
摘要:
附录 A,CUDA计算设备 附录 B,C语言扩展 ▶ 函数的标识符 ● __device__,__global__ 和 __host__ ● 宏 __CUDA_ARCH__ 可用于区分代码的运行位置. ● __noinline__ 和 __forceinlie__ ■ __device__ 函数由便 阅读全文
posted @ 2017-11-11 17:49
爨爨爨好
阅读(1187)
评论(0)
推荐(0)
摘要:
▶ 图形互操作性,OpenGL 与 Direct3D 相关。(没学过,等待填坑) ▶ 版本号与计算能力 ● 计算能力(Compute Capability)表征了硬件规格,CUDA版本号表征了驱动接口和运行时接口的(软件)规格。 ● Driver API 的版本号定义在在驱动头文件中的宏 CUDA_ 阅读全文
posted @ 2017-11-11 02:34
爨爨爨好
阅读(1371)
评论(0)
推荐(0)
摘要:
▶ 表面内存使用 ● 创建 cuda 数组时使用标志 cudaArraySurfaceLoadStore 来创建表面内存,可以用表面对象(surface object)或表面引用(surface reference)来对其进行读写。 ● 使用 Surface Object API ■ 涉及的结构定义 阅读全文
posted @ 2017-11-10 23:20
爨爨爨好
阅读(1671)
评论(0)
推荐(0)
摘要:
▶ 纹理内存使用 ● 纹理内存使用有两套 API,称为 Object API 和 Reference API 。纹理对象(texture object)在运行时被 Object API 创建,同时指定了纹理单元。纹理引用(Tezture Reference)在编译时被 Reference API 创 阅读全文
posted @ 2017-11-10 21:27
爨爨爨好
阅读(1998)
评论(0)
推荐(0)
摘要:
▶ 编程接口。参考 http://chenrudan.github.io/ ▶ Runtime API 为高层级管理接口,提供申请和释放设备内存,数据迁移,多 GPU 管理等。Driver API 为较低层级的控制接口,提供 CUDA 上下文(模拟设备主机进程),CUDA 模块(模拟设备动态加载库) 阅读全文
posted @ 2017-11-09 15:42
爨爨爨好
阅读(2479)
评论(0)
推荐(0)
摘要:
▶ 使用函数 cudaMallocPitch() 和配套的函数 cudaMemcpy2D() 来使用二维数组。C 中二维数组内存分配是转化为一维数组,连贯紧凑,每次访问数组中的元素都必须从数组首元素开始遍历;而 cuda 中这样分配的二维数组内存保证了数组每一行首元素的地址值都按照 256 或 51 阅读全文
posted @ 2017-11-08 20:05
爨爨爨好
阅读(9644)
评论(0)
推荐(2)
摘要:
10. 执行配置优化 ● 一个 SM中,占用率 = 活动线程的数量 / 最大可能活动线程的数量。后者保存在设备属性的 maxThreadsPerMultiProcessor 分量中(GTX1070为例,该值为2048)。较高的占用率不代表计算效率很高,但是较低的占用率意味着内存延迟严重,还有改进的空 阅读全文
posted @ 2017-11-06 15:32
爨爨爨好
阅读(671)
评论(0)
推荐(0)
摘要:
0. APOD过程 ● 评估。分析代码运行时间的组成,对瓶颈进行并行化设计。了解需求和约束条件,确定应用程序的加速性能改善的上限。 ● 并行化。根据原来的代码,采用一些手段进行并行化,例如使用现有库,或加入一些预处理指令等。同时需要代码重构来暴露它们固有的并行性。 ● 优化。并行化完成后,需要通过优 阅读全文
posted @ 2017-11-05 22:41
爨爨爨好
阅读(1539)
评论(0)
推荐(0)
|