并发/并行(进程/线程/协程)
肥宅_Sean
在UCB,Stanford各做过一段时间的RA。去牛津访学过一段时间。
现在在某家头部量化当研究员。
个人站: https://seanquant.github.io/
展开
-
OpenMP在Windows下用VS使用
简述直接新建一个项目来使用就好了。在项目中需要把C++\语言中把对openMP的支持选择是。否则程序只会调用一个线程。代码#include <iostream>#include <omp.h>using namespace std;#pragma warning(disable : 4996)void Hello();int main(int arg...原创 2018-11-27 09:34:58 · 2702 阅读 · 1 评论 -
【MPI编程】矩阵向量乘法--解法三(子矩阵块分解)【高性能计算】
简述子矩阵分解,就是说,将原来的矩阵给分解为更小的矩阵块。让所有的线程都共享有向量(但不共享矩阵)为了试验简单,这里做了几个简单的假设矩阵为方阵(n*n)comm_sz(线程数量)和n满足下面的关系n被commsz\sqrt{comm_sz}commsz整除comm_sz为平方数我们基于之前的版本改进【MPI编程】矩阵向量乘法–解法二(高性能计算)数据也是用...原创 2018-11-26 22:55:36 · 3915 阅读 · 2 评论 -
【MPI编程】矩阵向量乘法--解法二(高性能计算)
简述有留心过的朋友可能会发现,其实我没写过解法一。因为解法一就是大家最直观的感受的一种解法。将矩阵按照行划分,之后,再每个线程都用整个向量跟这个块做内积。之后,传回来一个数值。这里的方法二,将矩阵按照列进行划分。然后将列向量传递给所有的线程,之后,再传对应的向量的对应的元素,给这个线程。之后,这个元素(数值),乘上传给它的向量的每一个元素。最后,再做一个Reduce的操作,将所有的...原创 2018-11-26 17:52:37 · 8688 阅读 · 6 评论 -
【MPI编程】MPI_Bcast广播讲解和使用
函数范式int MPI_Bcast( void * data_p; int count; MPI_Datatype datatype; int source_proc; MPI_Comm comm;);实例功能描述: 下面实现了0件进程读取数据,并广播给所有其他线程。注意,跟其他集合通信函数类似,每个函数的内容都是一样的。还有,关于非0的进程,需要单独申请空间的...原创 2018-11-20 09:40:20 · 14093 阅读 · 1 评论 -
【MPI程序】向量乘法,向量点积(高性能计算)
简述假设,调用的节点数量整除向量的秩。高性能算法让0节点来读取文件数据所有的节点都负责计算,然后,这里使用的是块分配法。其他的都是接受到数据之后,再进行计算。而0节点由于需要负责传输和调度,所以它会在发送数据之后,再进行计算本地的块。之后,再来接受和保存数据。运行效果输入的数据为:101 2 3 4 5 6 7 8 9 102 3 4 5 6 7 8 9 10 118...原创 2018-11-06 00:35:34 · 2136 阅读 · 3 评论 -
【MPI高性能计算】蒙特卡洛方法计算pi值
蒙特卡洛方法就是通过概率模拟来近似计算。其实算法进度不是很高。代码在下面代码中的input文件中的内容是10000000运行效果:下面用四个核来做计算PS D:\C++\VS\repo\MPI-DEMO\Debug&gt; mpiexec -n 4 ./MPI-DEMO.exe3.14111#include&lt;stdio.h&gt;#include&lt;string....原创 2018-10-30 08:42:46 · 6731 阅读 · 1 评论 -
windows 10配置VS+MPI编程环境
简述参考了 https://www.cnblogs.com/shixiangwan/p/6626156.html其实不改那个x64也是可以的,如果使用x86,就需要导入库的时候,选x86就好了。其他不影响。但是他给的代码其实不是那么好,用我下面的代码,就可以直接运行就好了~#include &lt;stdio.h&gt; #include &lt;mpi.h&gt;#inclu...原创 2018-09-25 08:50:30 · 2830 阅读 · 0 评论 -
梯形积分法【OpenMP实现】多个版本
简述会用多个版本来写。操作是用命令行来操作。除了第二版本是在内容上基于第一个版本的完善,其他都是降低算法的复杂程度的,可以放心阅读文章目录简述版本1版本2版本3版本4版本1要求n被thread_count整除 不然可以会有计算错误。#include <iostream>#include <omp.h>#define FUN(x) (x * x)usi...原创 2018-12-21 11:32:44 · 3113 阅读 · 2 评论 -
【解决方案】调用multiprocessing中创建的文件无法打开的问题FileNotFoundError: [WinError 2]
问题在python多进程任务中,常常会使用共有的变量,交给Manager管理。但是这样写入的到的文件,有时候会由于我们操作的遗漏。导致没办法在其他文件中打开对应的压缩文件。比如报下面这样的错误:FileNotFoundError Traceback (most recent call last)<ipython-input-48-d0...原创 2019-05-16 15:50:31 · 1984 阅读 · 3 评论 -
【OpenMP实现】任意线程数并行化快排结合Merge排序100w--10线程下只用0.06s
简述通过这个标题也大概能猜测出算法的思想。Merge操作是O(n)的(出自于MergeSort归并排序)根据线程数将数据划分为thread_count块(较为均匀点就好了)每段上用qsort(快排)之后再用一个merge将所有的快排结果合并起来算法思想很简单,但是效果却不错。之前写过一篇用双进程写快排然后实现100w的排序只用0.2s这里测试过用两个的情况,效果类似PS ...原创 2018-12-29 11:41:02 · 1315 阅读 · 0 评论 -
MPI派生数据类型发送接收,降低发送时间
简述在很多并行计算问题中,最消耗时间的其实是在进程间交互的情况。所以,如果能降低在进程间的交互速度,那绝对是有帮助的。这就是学MPI派生数据类型的原因。派生数据类型非常繁琐… 但是也没办法啦派生部分的代码和注释// 创建自定义数据类型 // { int[3], double[5], char }; // MPI_Aint 存地址 MPI_Aint intarr_p, doub...原创 2018-12-28 21:19:04 · 1868 阅读 · 3 评论 -
CUDA编程--并行矩阵向量乘法【80+行代码】
简述矩阵向量乘法。读取文件data.txt并输入到output.txt文件中用typedef方便的修改数据类型(要是写成模板也是可以的)代码#include &quot;cuda_runtime.h&quot;#include &quot;device_launch_parameters.h&quot;#include &amp;lt;iostream&amp;gt;#原创 2018-12-23 14:39:42 · 2028 阅读 · 3 评论 -
CUDA编程--实现并行矩阵乘法【80行代码】
简述这里只写了方阵之间的乘法,但是本质上都是一样的。我测试过100规模的方阵之间的乘法,没有问题。代码读取文件data.txt数据格式就是一个数值N,然后来连续的两个N*N的矩阵。用空格隔开。#include "cuda_runtime.h"#include "device_launch_parameters.h"#include &lt;iostream&原创 2018-12-23 13:10:54 · 2199 阅读 · 0 评论 -
CUDA遇到在VS创建的项目运行报C1041错误
简述虽然感觉这个没多少人 会跟我一样遇到 但是还是感觉有必要写下来。万一有其他人也遇到了这个问题,大概可以省这个哥们好几个小时(甚至好几天的时间吧?)文章目录简述我的经历解决办法后记我的经历我以前为了方便 让cmd自动跳转到对应的目录下,在注册表下,给cmd添加了一个autorun的操作。让它自动运行切换页面这让我的cuda在命令行下运行的时候,就会出现问题了。无法打开程序数据库“f...原创 2018-12-22 22:33:13 · 1530 阅读 · 1 评论 -
【MPI高性能计算】用集合通信改进梯形求和积分
简述【MPI高性能计算】梯形面积积分计算里面有梯形积分公式的具体写法这里采用MPI_Reduce的集合通信的方式来计算APIint MPI_Reduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, int root, ...原创 2018-12-28 13:57:03 · 1072 阅读 · 0 评论 -
count_sort计数排序OpenMP的并行化
简述计数排序,就是统计某个数值在所有的数字中所应该存在的位置,然后,放到一个确定的位置上。非常简单的排序算法。程序会读取data.txt中的文件数据的样子10 0 2 3 1 4 8 6 7 5 9效果PS D:\C++\VS\repo\OpenMP-TEST\Debug&gt; ./OpenMP-TEST0 1 2 3 4 5 6 7 8 9代码#inclu...原创 2018-12-21 14:48:39 · 2062 阅读 · 0 评论 -
多协程爬取中大微博内容(以及转发数,点赞数,评论数)
这个是在之前的微博爬取(Python)–中大微博前100条微博内容以及评论转发点赞数目爬取 的并发版本代码import requestsfrom gevent import monkeyimport geventmonkey.patch_all(select=False)from pyquery import PyQuery as pqheaders = { '...原创 2018-06-20 10:08:28 · 5334 阅读 · 2 评论 -
笔趣阁(www.qu.la)小说爬取代码(python实现)
import requestsimport osimport geventfrom gevent import monkeyimport randomimport refrom lxml import etreefrom bs4 import BeautifulSoupmonkey.patch_all(select=False)from urllib import parse...原创 2018-06-26 22:51:13 · 12448 阅读 · 0 评论 -
UDP实现全双工聊天(聊天工具进阶)pyhton
聊天工具的基础版本,如果对下面的代码看的有些难度,可以点击访问先看简单的版本~全双工聊天就是指: 既可以任何一端,既可以发信息,又可以收信息,而且是独立的。(之前的半双工聊天,是每次只能有一端在发送信息,另外一端在对方没有发送过来信息之前是不能发送信息的,只能等对方先写好再来~)所以说,全双工还是比之前的先进了很多了呢~代码使用方法: 区别于之前的必须要有两个不同端口的代码,这次...原创 2018-02-28 15:56:48 · 5350 阅读 · 0 评论 -
多协程实例讲解(四 Python)
还是基于官方文档进行改写的结果import geventfrom gevent.event import AsyncResulta = AsyncResult()def setter(): """ After 3 seconds set the result of a. """ gevent.sleep(3) a.set('Hello!'...原创 2018-02-15 12:44:40 · 581 阅读 · 0 评论 -
多协程实例讲解(python 三)
还是讲解下这个官网上的代码吧代码在这:(讲解在下面)import geventfrom gevent.event import Eventimport time'''Illustrates the use of events'''evt = Event()def setter(): '''After 3 seconds, wake all threads...原创 2018-02-15 11:38:31 · 415 阅读 · 0 评论 -
多协程实例分析(一)
下面的代码中,我们实现了时间限制函数。即如果join的协程超过了之后就会自己弹出来。(并抛出错误来!) 这个错误也很有意思,那就是这个东西本身 Timeoutimport geventimport timefrom gevent import monkeyfrom gevent import Timeoutmonkey.patch_all(select=False)def ...原创 2018-02-14 21:40:10 · 448 阅读 · 0 评论 -
多线程实例分析(一)
import timeimport threadingdef fun(number): print('begin %d' % number) time.sleep(2) print('end %d' % number) passdef main(): print("Start time:", time.ctime()) threads ...原创 2018-02-14 11:54:26 · 349 阅读 · 0 评论 -
gevent.joinall()开启协程
这是我写的两个有关的博客,建议如果觉得下面的代码比较费解,可以先看下面的文章 Python并发Gevent库(一) AttributeError: module ‘select’ has no attribute ‘error’解决方法相比于 AttributeError: module ‘select’ has no attribute ‘error’解决方法 这篇文章,这里我加了...原创 2018-02-12 15:46:48 · 9907 阅读 · 4 评论 -
AttributeError: module 'select' has no attribute 'error'解决方法
gevent 实现多协程的时候,出现了上面的错误错误的代码如下:import requestsfrom gevent import monkeymonkey.patch_all()import geventdef f(url): print('GET: %s' % url) data = requests.get(url).text print('%d by...原创 2018-02-12 15:01:05 · 12013 阅读 · 0 评论 -
Python并发Gevent库(一)
The real power of gevent comes when we use it for network and IO bound functions which can be cooperatively scheduled.上面这句话是Python并发的一个库Gevent开始时谈到的之前也曾有幸看过一个清华大佬的文章(不记得地址了), 稍微有点理解了Python本身的多...原创 2018-02-12 14:07:18 · 1675 阅读 · 0 评论 -
C++多线程简单入门(二)(Windows版)
之前那片文章简述了如何使用C++多线程。 C++多线程模拟就好像是自己在做一件事情,但是感觉不够快,就跟自己的朋友说,在自己做的这一部分的时候,你去帮我做另外一部分,那么这样就提高了效率。(点击可查看)在这篇文章中,我们可以看出用endl是比直接写\n要慢的。所以,我这个要这个特点来展现多线程的过程。我们不妨来看一下这段代码:#include using namespace std原创 2018-02-05 17:13:36 · 251 阅读 · 0 评论 -
[解析]多线程加锁Lock调用python2
没有加锁的代码如下from atexit import registerfrom random import randrangefrom threading import Thread, currentThreadfrom time import sleep, ctimeclass CleanOutputSet(set): def __str__(self): ...原创 2018-03-09 21:31:01 · 588 阅读 · 0 评论 -
爬取小说1--高并发
爬取《放开那个女巫》小说还是采用高并发的协程来进行开启下载。其实,到现在为止,会了并发技术之后,诸多爬虫比较的,已经不再是用什么库,之类的问题了。 而是,开始研究爬虫的策略问题了。比如,这里,我的策略就是,要保证每一章必须要爬取到,否则就要接着等下去。(每次爬取200章,然后必须要等所有的都已经爬取完成之后才开始合并,之后再接着爬取接下来的200章。这个策略虽然保证的健壮性,但是在速...原创 2018-03-10 23:50:54 · 461 阅读 · 0 评论 -
生产者跟消费者问题(C++实现)
代码简述T 表示有T个生产者。同时也有T个消费者。 然后每个生产者总共生产T个数据。 每个消费者总共消费T个数据。N表示最大随机数大数值那个信号量的实现,我是直接copy课件上的。代码#include &lt;iostream&gt;#include &lt;string&gt;#include &lt;thread&gt;#include &lt;mutex&原创 2018-06-26 00:26:49 · 6286 阅读 · 1 评论 -
爬取猫眼电影前100名(获取图片并记录名字跟排名)
简述代码实现上,这个可以说是不难的。但是需要注意的是,这里的有一些细节得注意一下。协程的,gevent.joinall() 需要的是一个可以迭代的对象,但是内容必须是gevent.spawn()这个类这里有些小东西,比如在network上得到的包的内的数据(也就是直接爬取得到的数据,其实不是完全的数据,会有一些对于源码的部分的修改)。这种修改导致一开始,如果是看着检查的话,就会有bug...原创 2018-06-14 21:43:36 · 2141 阅读 · 0 评论 -
多线程生成随机数组+双线程归并排序(C++实现)
算法概述动态数组生成多线程随机数组生成双线程归并排序代码#include &amp;lt;iostream&amp;gt;#include &amp;lt;thread&amp;gt;#include &amp;lt;ctime&amp;gt;#include &amp;lt;vector&amp;gt;#include &amp;l原创 2018-06-07 11:39:17 · 1030 阅读 · 3 评论 -
多线程读取矩阵文件+多线程矩阵乘法(C++实现)
算法概述矩阵乘法可以在算法层面上进行并行。vector< vector > Mat[3]; 这个二维向量数组就是来放做矩阵乘法中的那些矩阵的。Mat[0]是矩阵A,Mat[1]是矩阵B,Mat[2]是乘法的结果矩阵。所以下图中关于这个就做了类似的修改。readMat就是用来读取特定的矩阵。注意,这里的target矩阵要用指针,如果改成用引用的模式,就会报错。这可能跟引用的机制...原创 2018-06-07 11:02:51 · 2740 阅读 · 0 评论 -
多线程随机数组生成+双线程快速排序(C++实现)(0.2秒排100W个数字)
简述用很多个线程进行随机数的生成 用两个线程来进行数组的排序基于的算法是快速排序算法。 基本可以做到 0.2秒左右的时间排完100W个数字#include &lt;iostream&gt;using namespace std;#include &lt;thread&gt;#include &lt;ctime&gt;#include &lt;random&原创 2018-06-13 12:26:50 · 1872 阅读 · 1 评论 -
多线程生成随机数组+多线程快速排序(C++实现)
描述这里对于对于每个快排递归过程都进行考量,如果对应的区域规模达到一定数值(也就是下面的代码中的MINLEN),设置这个,主要是考虑到对应的电脑的cpu的核数。如果申请的线程数大于对应的CPU核数的时候,就是没有意义的,反而有可能导致效率会降低。代码#include <iostream>using namespace std;#include <Windows...原创 2018-06-13 09:57:27 · 1162 阅读 · 0 评论 -
多进程爬虫(爬取小说)Python实现
区别于之前用多协程写的爬虫版本 多协程爬取小说 这个版本,开销会比较大。效率上也不一定有之前的高 不过,总体上还是很不错的~问题分析这个版本,还有之前的版本都一样,还存在问题,就是在下载好了文件之后,我们这里是会先打包成每个章节的小说,再通过一个脚本来,将这些章节整合起来,放到了小说文件中。但是,实际上,这样反反复复地写文件,删除文件,是非常耗时间的。 如果信息,都是直接存在内...原创 2018-04-28 11:12:25 · 1840 阅读 · 0 评论 -
【多进程并行版本】爬取链家二手房前100页标签,进行统计
前言python在进程间通信会比较麻烦~ 要注意,这里我们想到的时候多个进程一起维护一个字典。 所以,我加了锁。这里还是存在一个可能的改进方法,就是考察你的锁加在哪个位置来判断。 旧的单进程版本代码一:用时: 10.798075914382935秒 看了三千个网页的样子。还算不错的啦。但是还是想要跟好的优化~import requestsfrom bs4 import...原创 2018-04-21 14:02:23 · 656 阅读 · 0 评论 -
爬取小说2--协程间通信Python
通过Python进行协程间通信,大大加速爬取效率。前言是这样的,在之前的爬虫版本中,我们通过并发技术(python协程只是并发)。实现快速爬取小说的效果。 将速度提高为原来的几百倍了。但是却由于之前的多协程之间的通信,都是采用写入硬盘之后,再相互通信来实现的,所以,速度上还是存在一定的缺陷。最新在最新的版本中,我们采用多协程技术,采用在内存通信,这样来传递爬取的数据,之后,再来组...原创 2018-04-30 15:00:56 · 1771 阅读 · 0 评论 -
爬取广州所有停车场数据(Python)(并行加速版本)
之前做过这个的单进程版本。这次使用多进程来实现~ 爬取广州所有停车场数据(Python)大家可以对比着看一下,在原来的单进程爬虫的基础进行改进而得到的产品。import requestsimport osimport jsonimport multiprocessingimport timedef getAllJson(Session, data, headers): ...原创 2018-04-15 10:54:45 · 1680 阅读 · 1 评论 -
【具体使用实例】Rall封装线程(C\C++)
局部对象就要被逆序销毁。通过这个性质,创建一个RAII等待线程完成(RAII,Resource Acquisition Is Initialization)。 这里是通过一个类实现的。通过简单的封装之后,使用起来会比较方便。这个核心的RALL封装的类代码如下:class ThreadGuard { thread& t;public: explic...原创 2018-03-18 10:47:39 · 1127 阅读 · 0 评论