- 博客(24)
- 资源 (5)
- 收藏
- 关注
原创 动态增删kdtree(ikdtree)主要思路
上述做完之后,可以认为已经动态改变了,但是也可以看见,此时的删除和插入操作其实已经破坏了kdtree的特性,例如删除操作破坏了平衡特性,增加了很多无效的节点,增加了遍历,插入操作则破坏了树平衡性和有序性两个特性(这里注明一下,有序性的破坏并不会影响结果,这里让我迷糊了很久,因为寻找最近点即使有序的二叉树仅通过包围盒也是无法排除另一个孩子树的)。
2023-10-26 18:25:07
996
原创 多边形三角化Earcut分析,以mapbox EarCut源码举例
在判断isEar的时候,mapbox遍历了所有顶点来判断是否有顶点在三角形内,其实三角形box范围内搜索就足够了,那么怎么来缩小这个搜索范围,毕竟是个二维数据,mapbox应用了z-order算法将二维数据映射到一维的方式,然后排序缩小了顶点的搜索范围。首先说一下Ear在程序中的判断依据:Ear点是多边形中的凸点并且它和它相邻的两个顶点组成的三角形内部不包括包括多边形的其他顶点。有了顶点顺序,就可以判断Ear,然后就可以选择三角面的三个顶点了,即Ear和它的相邻两个顶点。这里有向面积是该顶点和下一个顶点,
2023-06-09 11:46:02
1454
2
原创 opengl 先旋转后平移和先平移后旋转解惑
我们知道,在opengl中,如果先平移后旋转,如果模型中点不在原点,会导致模型的位移发生变化。但在项目中遇到一个问题,如果不知道模型中点,或者知道模型中点一定不在原点,但我们也只需要模型方向,那么我们直接将模型旋转会得到我们想要的方向吗?即如果先平移后旋转能不能得到想要的方向? 这个地方我疑惑了很久,因为轴只有方向没有位置,默认的旋转会朝着原点计算,当时的想法是不能,想着可能整个模型会绕着原点旋转,相当于位移了,而本身形状不会变化,但结果显然是错的。 首先做了...
2021-01-14 16:45:49
5722
2
原创 C++ char类型打印为空
学过C的应该都知道char类型是专门用来存储字符的,如'a','1'等等,大部分人也就局限于此,但实际上char类型是一种整型,8位的整型,也有类库定义为int8。 计算机只能存储0,1,也就是数字,从计算机结构来说,也注定不能存储'a','b'等字符,但实际上我们真真切切使用了字符,这就涉及到计算机的编码(如ascii),百度百科中说明了ASCII诞生的原因: 在计算机中,所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0),例如...
2020-06-03 15:10:23
2016
原创 Qt http操作
在介绍Qt http之前,先介绍以下http的基本过程:http是一个简单的请求-响应协议,百度上是这么定义的:http通常运行在TCP之上,它是基于C/S架构进行通信的,其客户端的实现程序主要是Web浏览器,例如Firefox、InternetExplorer等。Web服务是基于TCP的,因此为了能够随时响应客户端的请求,Web服务器需要监听在80/TCP端口。这客户端浏览器和Web服务器之间就可以通过HTTP协议进行通信了。http通信过程包括:客户与服务器建立连接;客户向服务器提出请求;服务器接受
2020-05-12 15:14:42
2417
原创 C++ static关键字用于类间指针传递
C++ static关键字有很多作用,包括保持变量内容的持久,初始化值为0,以及C++成员变量的无类化等等,大部分作用可以在博客https://blog.youkuaiyun.com/wangbeibei23/article/details/89343705中看到;在大型软件项目中,类之间指针传递是一个大的问题,如在A类新建一个类指针,假设设为subA *a=new subA,这个a指针需要在B类中使用,...
2020-04-26 16:38:46
549
原创 cuda 通用原子操作
在多线程中,访问共享资源时,确保所有其他的线程都不在同一时间内访问相同的资源,就叫作原子性。在主机上,一般通过互斥锁(mutex,lock)的方式来保证线程之间的原子性。那么在cuda中,如何保证核并行的原子性?cuda对一些常用操作包括加、减、按位与、或等提供了原子操作的函数,具体可参考博客https://blog.youkuaiyun.com/dcrmg/article/details/5495930...
2020-03-19 11:18:26
2355
1
原创 opengl渲染流程
简单来说,opengl渲染流程主要包括顶点变换,图元装配,纹理计算或着色和光栅化四个阶段。 图片截至博客https://www.cnblogs.com/zhanglitong/p/3238989.html...
2020-02-26 20:01:15
1928
原创 cuda 共享内存bank conflict详解
在cuda并行计算中,共享内存在GPU速度优化上扮演着重要作用,但是如果共享内存使用不当,也会导致速度不快反降或者提速效果不佳,如发生bank conflict;bank的中文翻译为存储体,GPU 共享内存是基于存储体切换的架构(bank-switched-architecture),一般现在的GPU都包含32个存储体,即共享内存被分成了32个bank;根据GPU计算能力的不同(Compute...
2020-01-13 10:10:22
10739
11
原创 动态规划
我们来看看动态规划百度百科的定义:动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优的解。动态规划算法与分治类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分解得...
2019-12-31 16:08:21
977
原创 CUDA流任务并行
CUDA流表示一个GPU操作队列,并且该队列中的操作将以指定的顺序执行。可以将每个流视为GPU的一个任务,并且这些任务可以并行执行,即相同流顺序执行,不同流并行执行;不同流并行执行时不同流所要执行的任务要没有依赖关系;当不手动创建流时,cuda将会默认一个流操作。 在硬件选择上,这里有一个概念,支持设备重叠功能,支持设备重叠功能的 GPU 能够在执行一个 CUDA C...
2019-12-19 17:32:57
3426
1
原创 cuda点积运算
最近在研究并行运算的规约算法,在看《GPU高性能编程CUDA实战》这本书中点积运算时,有些问题想了很久,记录下来;注点积公式:(dot(A,B)=a1*b1+a2*b2+...+an*bn)书上例子算点积运算时分为了以下几步:1.申请共享内存cache;__shared__ float cache[threadsPerBlock]这里要注意一个概念:一旦这样声明共享内存,就会...
2019-12-18 15:42:06
1671
原创 C++ thread 那点事
1. C++线程通过thread th(func)或者thread *th=new thread(func)建立;建立线程后,记得在作用域内调用join或detach,否则退出作用域后程序会异常退出;其中join表示阻塞主线程在join处,等待子线程结束后再继续;detach表示主线程与子线程分离,独立运行;2. mutex(互斥锁)用于在多个线程访问同一资源时,保证数据的一致性(lock/...
2019-12-16 17:32:47
1301
原创 cuda 使用trust库计算最值
Thrust是并行算法和数据结构的基于GPU CUDA的C++库,类似于C++标准库stl,cuda安装后自带。Trust用于求最值的函数为min_element和max_element,和stl名字一样;我是偶然发现原来cuda还有一个这个库,在项目中,因为中间有一个过程需要最值的索引,原本我是把数据从显存中拷贝到主机,然后使用stl的标准库计算的,因为主机与设备之间的数据交换慢,速度不是很...
2019-12-14 16:51:54
1958
3
原创 CUDA笔记
1.cudaDeviceSynchronize()用于CPU和GPU同步,即cpu和GPU均运行至cudaDeviceSynchronize()后再继续;CPU多线程时,会阻止所有线程;2._syncthreads()用于核函数内线程块线程同步,即同一block内所有线程执行至__syncthreads()处等待全部线程执行完毕后再继续(因此_syncthreads()不要位于发散分支中(if...
2019-12-12 17:11:51
317
原创 cublas 矩阵乘法
cublas是cuda用来解决线性代数的问题的一个函数库,而且对于矩阵运算来说,其效率比大部分人自己写核函数高不少,只是cublas不同于C++,是列优先存储,因此参数一不小心设的不对,结果大不相同,所以记录下来;首先介绍一下什么是列优先存储?C++中,二维数组也是通过一维数组传进去的,假设我们有1个2*2的数组,设为a=[1,2,3,4],那么C++变成2*2的数组,就为[1,2;3,4...
2019-12-11 11:13:10
3326
原创 数组地址和指针变量地址
在项目测试中,误用了数组地址(当然也没错),后面依葫芦画瓢,使用了指针,最后造成了程序崩溃,所以记录下来;首先是测试结果没问题的代码:#include <iostream>#include <fstream>using namespace std;float arrSig[16000];int main(){ ifstream input("da...
2019-12-06 10:13:23
497
原创 C++由于结构体对齐问题造成的程序崩溃
在项目中,遇到一个由于结构体对齐问题造成程序崩溃问题,测试了半天,终于复现了出来。首先定义一个头文件test.h:class Test{ public: Test(); short id; string name;};然后再建立test.cpp文件完成构造函数:Test::Test(){}可以看出这里构造函数什么都没干,但是它必须要,否则不...
2019-11-22 16:17:14
1607
原创 C++ 多线程 报错invalid use of non-static member function
创建一个类test:class test{ public: void func() { std::cout<<"test"; }};main函数多线程调用test:test *t=new test;std::thread th(t->func);编译报错,GCC编译器报错invalid use...
2019-11-21 15:59:42
10937
原创 Qt udp数据发送太快,数据丢失
Qt 在单线程中,如果数据发送太快,应用程序还在处理别的程序,就会触发不了readyRead信号,导致造成数据的丢失,解决方法可以将udp处理类继承于QThread,在多线程入口run函数里通过死循环接收数据,通过信号槽机制通知处理函数进行处理。介绍Qt多线程的一个博客https://www.cnblogs.com/xia-weiwen/p/10306089.html...
2019-11-21 14:06:05
3890
原创 linux 上 通过C++ 标准库thread 建立的线程怎么关闭
C++11 自带了线程库thread,之所以要写linux,是因为C++标准库thread在底层,仍旧使用的是平台相关的线程API。在linux上C++标准库thread使用的是pthread,实质上是在pthread上封装了一层,因此thread的释放靠得就是pthread。首先,我们新建一个线程: std::thread th(function); //注意,如果是使用new 创...
2019-11-17 11:13:23
2937
原创 nvcc 将动态并行cu文件编译成动态链接库
如果cuda程序没有使用动态并行,编译动态链接库为:nvcc -arch=sm_60 -std=c+11 -O3 -rdc=true -Xcompiler -fPIC -c algorithm.cu -o algorithm.og++ algorithm.o -fPIC -shared -o libalgorithm.socuda文件中如果使用了动态并行,编译成动态链接库需要使用以下...
2019-11-10 16:30:31
2543
3
原创 Qt Creator cuda动态并行工程配置
动态并行允许从GPU端启动核函数,它要求显卡计算能力大于3.5.动态并行Qt Creator的工程配置与不使用动态并行时有较大差别,以linux系统为例QT += coregreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = testTEMPLATE = appDEFINES += QT_DEPRECATED_WAR...
2019-11-10 16:03:17
910
原创 windows上使用QT creator运行cuda程序的pro配置
在Windows上用qt写界面,需要用到cuda,windows上qt配置cuda花了很长时间,现在分享出来windows上Qt Creator配置cuda与linux上大同小异QT +=coreTEMPLATE = appCONFIG += c++11CONFIG -= app_bundleTARGET = simulationSOURCES += main.cppHEAD...
2019-11-09 23:07:32
3188
3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人