自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(196)
  • 收藏
  • 关注

原创 End-to-End Object Detection with Transformers[DETR]

End-to-End Object Detection with Transformers[DETR]背景概述相关技术背景最近在做机器翻译的优化,接触的模型就是transformer, 为了提升性能,在cpu和GPU两个平台c++重新写了整个模型,所以对于机器翻译中transformer的原理细节还是有一定的理解,同时以前做文档图片检索对于图像领域的目标检测也研究颇深,看到最近各大公众号都在推送这篇文章就简单的看了一下,感觉还是蛮有新意的,由于该论文开源,所以直接就跟着代码来解读整篇论文。概述整体

2020-06-08 18:06:43 9353 18

原创 cuBLAS矩阵乘法

cuBLAS是cuda封装好的一个数学库,头文件为<cublas_v2.h>#define cublasSgemm cublasSgemm_v2CUBLASAPI cublasStatus_t CUBLASWINAPI cublasSgemm_v2( cublasHandle_t handle, cublasOperation_t transa, cublas...

2020-04-03 21:05:55 2292 2

原创 6. 设计模式之《单例模式》

单例模式,顾名思义就是只有一个对象,考虑一下什么时候只需要一个对象?常见比如日志对象,这种最好就是一个项目中一个对象。class Log{public: Log* getLog() { if(nullptr == m_log) log = new Log(); return m_log; }private: st...

2020-03-30 23:19:20 186

原创 cufftPlanMany参数说明

最近在看cufft这个库,传统的cufftPlan3d()这种plan接口逐渐被nvidia舍弃了,说是要用最新的cufftPlanMany,这个函数呢又依赖一个什么Advanced Data Layout(),最终把这个api搞得乌烟瘴气很难理解,为了理解自己写了一些测试来验证各个参数的意思,这里简单做一下总结。下面是函数声明以及对应的参数解释,看不懂的话可以结合后面的例子琢磨琢磨。图示如下,这里没有画输出,意思和输入一样,接下来做个实验试试。

2024-05-08 17:44:37 276

原创 第三章、汇编2

chat-gpt解释如下:其实jmp分为相对短跳转(short jump)和相对长跳转(near jump),二者的汇编虽然都是用jmp这三个字母,但是汇编器会根据输入立即数的大小翻译成不同的二进制, 指令分别被翻译EB(短跳转) 和 E9(长跳转), 二者立即数范围分别是1字节(-128~+127)和4字节 (-2,147,483,648 ~ +2,147,483,647)。这个好处是可以利用一些简单的加法和乘法,减少指令个数。除法和乘法差不多,不过只有一个操作数,分子是128bit,分母是64bit。

2024-04-23 23:40:13 207

原创 第三章、汇编1

g:这是另一个编译选项,用于生成调试信息。使用 -g 选项编译程序会在生成的可执行文件中包含调试信息,包括源代码中的行号、变量名等,以便在调试器中进行调试时能够准确定位到源代码的位置。-g 选项通常与其他优化选项一起使用,以便在优化后的代码中进行调试。,以尽量保持生成的代码易读易调试。但是,它并不会进行像 -O1、-O2 或 -O3 这样的更加激进的优化。因此,当你希望在调试时仍然能够方便地查看源代码和变量名时,可以使用 -Og。-Og 的含义是“优化级别为 g”,其中的 “g” 代表了"g优化"。

2024-04-23 22:14:17 1625

原创 cutlass之基础类型

矩阵的layout, 其实就是把coord包装一下,主要看看两者的区别, 其实layout中主要就是包含上面说的一个stride, 也确实,一旦固定是行优先还是列优先后,只要定了stride后就固定了格式。W], 至于为啥是这个顺序我也不知道,估计是约定俗成的。理解步长其实就是在内存中,N0距离N1的长度是C。不是很明白为啥RowMajor是class, 而其他类型是struct?真是让我强迫症犯了。

2024-04-07 17:49:39 168

原创 cutlass序言

最近自己的服务器终于搞定了,虽然显卡是3060Ti, 但是基本目前nv主流的库和工具都支持,所以后续开始稳定研究cuda了,nv的库用过很多,目前玩过cub, thrust, cudnn,tensorrt等,但是只有少部分开源,比如cub和cutlass, cub是开源的但是都是一些经典并行算法,自己也移植过一个sort算法收获颇丰, cutlass更多是一些AI相关的算法,为了紧跟大模型时代,所以后面准备做个博客系列来分享学习经历,一方面记录,一方面看看能不能给国产GPU的高性能工程师一点优化参考,毕竟这

2024-03-27 14:19:50 135

原创 unique_ptr使用说明

指针问题一直是一个比较麻烦的事情,比如很多人说要用智能指针完全替换掉裸指针,有人说要用unique_ptr, 有人建议shared_ptr,可是实际看各种经典框架,发现一个框架什么指针都有,使用的方法也是无法八门,这里简单说一下unique_ptr的使用场景和注意事项。unique_ptr核心目的是:1.所有权唯一。2.避免所有人忘记delete。但凡符合这两个要求就可以建议使用unique_ptr。

2024-03-12 15:22:30 369

原创 CMakeLists.txt简单demo

这里需要主要一个-O3 -DNDEBUG, 我们知道-O3是编译选项,但是-DNDEBUG是宏定义,为啥都扯到FLAGS里面了,其实是我们用了set(CMAKE_BUILD_TYPE “Release”), cmake直接把“-O3 -DNDEBUG”这个字符串打包给了target_compile_options, 理论也不该这么写,但是-O3和-DNDEBUG一般同时出现,所以软件为了方便打包放一起了。这样做的目的可能是为了确保在链接阶段也使用相同的优化选项和宏定义,以保持整个编译过程的一致性。

2024-02-22 14:11:18 867

原创 C++中的static和hidden

动态库。

2024-02-05 22:00:52 425

原创 第三章、汇编语言

大部分人对数值信息都了解七七八八,但汇编了解的人却不多,虽然我学过王爽的《汇编语言》,但那个时候对计算机理解不深刻等于没学,目前在工作中遇到很多相关问题每次查起来很麻烦,这次正好借csapp再系统的梳理一遍,顺便利用拆弹作业做个巩固。

2024-01-09 13:57:13 358

原创 第二章、信息的表示和处理

在实际编程中,依然对有些数值的处理和变换比较模糊,在看csapp的时候发现里面的论述很详细,常规问题不在此赘述,这里主要是记录大部分人的知识点盲区。参考:https://blog.csdn.net/feng__shuai/article/details/79111084。

2024-01-07 15:24:52 425

原创 CMake项目管理

假如项目名称叫project, 一般可以按照下面的方式组织代码,这里可以看到include里面又补了一个项目名字,这个目的是啥?目的是在一个project避免不同模块中里有相同的头文件,比如下面的A.h。目前看到很过很多框架,很好奇大家如何从头搭建一个C++的库,这里简单介绍一个基本模板。

2023-12-21 22:57:43 403

原创 find_package 和 find_library的区别

经常看CMakeLists.txt中有find_package和find_library,有时候没留意以为都一样,其实二者差距比较大,下面简单记录一下。find_package(NAME), 这段代码的本质就是在找一个NAME.cmake这个文件,一般在安装库的时候,会随行带一个文件NAME.cmake安装在系统的cmake文件里。https://zhuanlan.zhihu.com/p/631259689

2023-12-14 12:21:46 524

原创 tuple在模板编程中的使用

tuple的实际使用。

2023-12-12 19:12:47 365

原创 cmake生成表达式

不积小流,无以成江海。

2023-12-08 19:06:56 512

原创 realname,soname和linkname

其实soname设置为A.so也是可以的,这样的话,如果我更新为11的大版本后,理论上厂家A还是可以运行可执行文件,但是我版本变动太大,A在实际生产中会报错,为了把风险控制在可执行文件启动前,所以可执行文件的soname最好有版本号,这样程序会启动失败,提醒你却是版本10的so。当我发布一个动态库的时候,比如版本是maj.min.patch(10.2.1)的格式,当我改了小版本的号的时候(10.3.1),如果厂家A用的是我写的库,他需要做什么?

2023-11-26 23:16:28 453

原创 第七章、链接

to do。

2023-11-23 11:01:52 59

原创 编译期的可变长参数包

下面是c++14支持了序列生成。下面每一行代码要是研究明白啊。

2023-11-09 00:12:42 107

原创 cuda cache相关知识总结

I was reading about the L1 and L2 caches load and store and I have found that if there is a miss in L1 for a load instruction, L1 will get only the sector (32byte) of the 128 cache line from L2. But why do we say that the granularity of a fetching is 128by

2023-10-27 11:41:33 99

原创 条款33、避免遮掩继承而来的名称

基类的成员函数和派生类的成员函数不会构成重载,如果派生类有同名函数,那么就会遮蔽基类中的所有同名函数。

2023-10-17 23:39:19 107

原创 如何禁止在堆上和栈上创建对象

因为new一个对象会调用operator new函数。所以把这个函数设置为private就可以了。设置成protected, 目的是继承时的时候好调用。

2023-10-17 23:24:50 120

原创 抽象类与虚基类

发生继承过程中,A:virtual public B。类中包含纯虚函数就是抽象类。

2023-10-13 16:29:13 38

原创 C++函数名与类型

假如上面的函数编译通过的话,下面调用就会出现歧义,为此c++对于函数名而言拒绝使用返回值,一个函数的名字就是, 有些语言支持函数返回值不同的函数,但是在调用的时候就不支持上述写法了。下面我们用is_same做一个实验可以看出来。

2023-10-12 10:30:26 112

原创 6.5 改变函数申明

动机做法demo

2023-09-28 10:57:32 33

原创 编译器自动生成的构造函数

我们根据上面已经知道,编译器会自动生成构造函数,但是如果程序员自己提供了构造函数怎么处理?string A;Student B;Teacher C;int e;Test()补充初始化列表Test()//编译器会报错:成员变量**对象**(不是基础数据)必须在构造函数初始化列表里初始化挪到函数中Test()A(),B();C();// 等效于:tmp("student"), B=tmp;

2023-09-25 14:01:14 118

原创 .inl文件

内联函数通常在C++头文件中实现,但是当C++头文件中内联函数过多的情况下,我们想使头文件看起来简洁点,能不能像普通函数那样将内联函数声明和函数定义放在头文件和实现文件中呢?最近工作涉及到thrust库,看了半天也没找到一个头文件的函数定义,本来以为会有一个cpp源文件对应h头文件,后来问头文件的末尾发现了一个include,所以有必要了解这个文件组织形式。由于编译器不支持将模板的声明与实现分开编译,但是有了inl文件,我们可以把声明放在头文件中,然后将具体实现放在inl文件中。

2023-09-08 15:41:15 372

原创 single-passParallel Prefix Scan with Decoupled Look-back

最近在写基数排序,nvidia的基数排序依赖这个实现,所以有必要搞懂。

2023-08-01 13:37:31 73

原创 6、C++内存模型

assert是仍然有可能触发的!內存模型是std::memory_order_relaxed, 根据这个内存模型的说明,1,2处可能乱序,5,6和7也可能重拍乱序。C++11开始支持多线程,其中提供了原子类型atomic, 和atomic关系比较密切的是memory_order,所有的内存模型都是指atomic类型。保证了读写的完整性(不会读取到写一半的数据,要么是新值,要么是旧值),而且要求单个线程内的同样一个原子变量的各种操作顺序不能进行重排。

2023-07-28 10:26:35 298

原创 C++ memory order 可见性概念

根据上面示例可以猜测,所谓的可见就是,一旦线程1遇到走到memory_order_acquire(flag_is_init)时候,假如flag_is_init是true,那么可以保证线程0在memory_order_release(flag_is_init = true)之前的代码100%是执行了。假如flag_is_init 还不是true的话,那么thread1也就可以确定thead0至少还没执行到memory_order_release这一行代码,init()可能执行了也可能没有执行。

2023-07-27 17:50:54 118

原创 C++ memory order问题

【代码】C++ memory order问题。

2023-07-27 16:53:50 191

原创 cub中scan

scan是有很多经典算法,我们这里主要介绍一种onesweep的方式。

2023-07-27 13:53:36 45

原创 非类型模板参数

除了日常用的typename以外,模板还有很多非类型模板参数。

2023-07-26 10:08:28 69

原创 cub中的ChainedPolicy

上面的设计可以达到目的,假如机器是80的arch,那么最终生效的就是Policy80, 好了目前为止又掌握了一个模板炫技的戏法。

2023-07-23 18:48:32 121

原创 类模板相关知识

这里会报错,所以为了使用偏特化的功能,我们最好给Enable 改名给 dummy, 而且给一个默认赋值void, 不用担心和后面偏特化有竞争,即使一样编译器也会优先选择偏特化版本, 不会报错。,没搞明白的一定要搞清楚,不然后面越来越迷糊。现在类模板又是一种新的实例化流程,因为类模板有偏特化,所以和函数还不太一样。可以看到,原模板也可以生成同样的实力,但是编译器优先选择符合的偏特化版本。之前的文章里我们分析过函数模板实例化的过程,可以参考。如果有两个一模一样的偏特化版本,那么就会编译报错。

2023-07-18 14:25:50 65 1

原创 模板类型推导

虽然是讲函数模板推导,但是借用类模板来导出今天的话题, 我这里写了一个类模板,可以看到T可以被偏特化为[T, T*, T&, T&&], 此外还有[const T, const T*, const T&, const T&&], 下面的代码可以改吧改吧验证这个想法,举这个例子是说,既然typename T可以偏特化这8种类型,那么是不是也可以推导出这么多类型?这里注意数组的推导类型,在引用里会有区别。最近在写代码的时候经常被类型推导搞晕,今天好好总结一下。所谓的类型推导只是针对于。

2023-07-16 23:03:29 339

原创 模板函数如何实现偏特化效果

从唬人角度上,感觉第一个更迷惑,第二写法就比较通俗易懂。第一种写法给人感觉就是运行时判断的味道,第二种一看就是编译期的处理。因人而异遇到框架能看明白就行。

2023-07-14 14:58:56 266

原创 cuda中radix_sort

在second step中完全实在ScanCounters()函数中,具体分为upsweep, exclusivesum, downsweep.最终的目的是吧share memory的值修改成为下图中最右边的结果。这里的流程可能会和源码有出入,但是结果没问题。radix_sort排序是一种经典排序,在gpu上都有对其进行支持,这里主要参考cub中的实现,简单介绍一种单block的情形, 本文只适合看过源码但是没有看懂的同学。

2023-07-12 14:28:27 343

原创 第3章、虚函数

本章将讨论虚函数对性能的影响。

2023-07-06 17:33:01 43

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除