把大矩阵拆解为一个个小矩阵,把一个小矩阵当做一个元素,那么大矩阵就看起来不那么大了两个大矩阵的相乘,就变成了两个不那么大的矩阵相乘, 所得矩阵中的每一个元素,仍然来自相乘矩阵的某一行和某一列的乘法求和, 只不过这里的”乘法”变成了小矩阵之间的矩阵乘法。如下图: 基于以上的矩阵分解方法, CUDA对大 ...
CUDA Matrix Transpose using Shared Memory 使用cuda共享内存优化矩阵转置
常常我们使用shared memory,为了解决以下两种问题:1)同一个全局内存既被读取,又被写入。为了避免写入覆盖,于是放shared memory里暂存,所有数据处理好后,最后一起写入全局内存。2)避免重复读取全局内存影响性能,所以一开始把数据存到shared memory,以便之后多次读取 本 ...
Shared Pointer 智能指针和动态内存
C++11 引入的智能指针及其搭配的动态内存申请方法,在我看来是new的加强版,它不仅速度更快,而且不需要用户考虑内存销毁。本文通过小例子回顾一下各种内存管理的效果。 1) 普通情况函数内的变量a是创建在【栈】里,即使其指针随函数返回,但变量内存会随着函数的销毁而出栈销毁// main.cpp#in ...
Why Iterator 为什么要用迭代器
为什么要用迭代器,这个问题常常伴随着“有指针还不够吗”。是的,不够,因为指针作为内置数据类型,已经把功能限定好了,你没法让++和--的功能互换。 而迭代器可以。 当我们看到下面的代码#include <iostream>#include <vector>using names ...
Lambda in C++
按照对象的某个属性排序,是一种常见的排序需求。在c++11之前,是这么做的: #include <iostream>#include <iomanip>#include <vector>#include <algorithm>using namespa ...
Decoupling by Virtual Function 通过虚函数解耦合的软件设计
为什么C++世界要虚函数以及纯虚函数,然后用父类指针指向子类?反正怎么都需要先创建子类实例对象,为何不直接使用这个子类对象,而要多此一举先赋给父类指针,再使用?答案是 —— 为了软件模块化和程序员协作的独立性,也称解耦合。 举个例子1)我手握一个父类指针,指向一个对象,不关心具体指向了什么对象,我只 ...
Static Variable Encapsulation by Function 静态变量的安全性
函数内部定义的static变量,事实上是全局变量。 而这个全部变量却无法在函数外直接读取,除非函数返回它的引用。理解以上,就可以让函数内定义的静态变量可以实现类似私有成员变量的安全性。 1) 通常,保持一个变量的安全性的做法,是把这个变量变成某个类的私有成员变量,这样就只能通过类的方法来设置和获取。 ...
A Test FrameWork Affected by Linking 一个受链接顺序影响的测试框架
最近看到一个好用的测试框架,自己做了个实验,于是记录下来//framework.hpp#include <string>#include <vector>namespace framework { class TestBase{ ...
How variable/function is found during build 编译器如何找到变量和函数
本文源自于我试图理解”extern”所做的实验。本文不讨论extern “C”的使用情况。先看实验,再讲感想: 变量实验(1):普遍易懂//header.hint a=999;//main.cpp#include <iostream>#include "header.h&quo ...
Matrix Multiple by CUDA Shared Memory 使用共享内存优化矩阵相乘
本来来自对于CUDA中使用shared memory进行矩阵相乘的思考。之所以写下它,是因为我感觉到这个例子代表着cuda处理矩阵的基本思维方式,掌握它,时常复习它,很有必要。 目标是实现矩阵相乘: 它是如何思维的:1)全局看,gridDim是完全映射输出的矩阵C,基于定义了C的row, col两个 ...