精华内容
下载资源
问答
  • 浅谈.NET下的多线程和并行计算系列文章索引   浅谈.NET下的多线程和并行计算(一)前言   浅谈.NET下的多线程和并行计算(二)线程基本知识   浅谈.NET下的多线程和并行计算(三)线程同步基础上   ...
    展开全文
  • 多核多CPU多线程并行计算,在某些情况下的确是对性能有大幅提升。但问题是,对性能的提升并不是一定的。商家技术提供者,为了自身的利益,很多情况下只展示了美好的一面,却把不利的一面加以隐藏。 线程的切换、...

    多核多CPU多线程并行计算,在某些情况下的确是对性能有大幅提升。但问题是,对性能的提升并不是一定的。商家和技术提供者,为了自身的利益,很多情况下只展示了美好的一面,却把不利的一面加以隐藏。

    线程的切换、调度,线程数据的同步,都须要消耗系统时间。线程越多,消耗越多。同时伴随引发的CPU的流水线清空,每次清空也将导致数十个时钟周期的浪费。虽然在以线程为单位进行调度的操作系统下,多线程能争取到更多的运行时间,但如果操作系统调度的单位是进程,而不是线程的话,多线程并不能争取到更多的运行时间,反而还会因进程内线程的调度而产生额外的消耗。

    对于多核多CPU计算而言,先假设同一线程在同一时间片内只运行在一个Core上。那么,如果任线程在不同的Core上自由调度,则对每个Core有自己独立的L1、L2级缓存的CPU而言,对于某些任务线程,因为运行的Core变了,对应的L1、L2级缓存也同时变更,则如果上个时间片内的有效数据即使没有被换出L1或L2缓存,也不可以再加以利用,因为那些数据存在于另外一个Core的高速缓存中。于是高速缓存将需要重新加载。而在加载之前则得从另外一个Core的高速缓冲中重新将数据写回内存。因此,时间上的开销便出现了。相对而言,两个Core共享相同的高速缓存的CPU架构则没有这个问题。因此,如果因高速缓存频繁命中失败而导致的数据同步的时间开销相对于任务单元显著加大的话,则可以考虑将任务线程绑定单个Core运行。现在再假设,如果多核调度的策略是:同一线程的不同片断在同一时间片内可以运行在多个Core上。则如果线程编写不好,便会导致多个Core之间的数据同步。而如果数据同步处理不当,便会引发国企数据的使用,从而导致进一步的错误。

    任何技术的采用,都得付出其相应的代价。因此,无论是多线程还是多核多CPU,无论是OpenMP还是CUDA,如果其带来的弊端大于其带来的好处,便需要仔细考虑一下,追赶时髦技术所付出的代价,是否值得。

    展开全文
  • Matlab 多线程并行计算

    千次阅读 2020-12-17 21:22:42
    首先要区分一下并行计算多线程的区别。并行计算是指 开启多核来进行同一个任务的计算。多线程是指调用资源来分别执行多个不同的任务。 Matlab 并行计算是在2012版本之后就从 matlabpool 命令改成了 parpool命令,...

    首先要区分一下并行计算与多线程的区别。并行计算是指 开启多核来进行同一个任务的计算。多线程是指调用资源来分别执行多个不同的任务。
    Matlab 并行计算是在2012版本之后就从 matlabpool 命令改成了 parpool命令,网上有关并行计算的的资料还是挺多的。这里就不再说了。
    Matlab在多线程方面用的就不多了。这里仅仅提供一个小的例子,一些更多的细节还是要去看官方文档的。

    利用 Matlab 进行并行计算时,还需要说明几个概念:

    • job : 即Matlab待完成的任务,job由一组 task(作业)组成。
    • task : 并行计算的基本单元,分配到Matlab worker执行
    • scheduler :负责管理Matlab 提交的job, 分配 task 到每一个 worker
    • worker: 是指工作单元,数目一般小于等于 CPU的核数。lab是特殊的一个worker,lab之间可以进行数据通信。
      在这里插入图片描述
      在这里插入图片描述
      因此,我们如果想要执行不同的程序或代码,方法有:
    • 开多个Matlab(最直接)
    • 把不同的程序写成 function ,分配给不同的task.
      这里就试验一下第二个方法,就是同时进行画图与存数两个功能。由于下面的createTask函数的第二个参数只能是function,不支持脚本,所以有写了两个function(mytxt, myplot)。
      mytxt.m
    function state = mytxt(A)
    
        filename = 'C:\Users\Administrator\Desktop\haha.txt';%文件路径 + 文件名
        file_id = fopen(filename,'a+');
        for jj = 1:length(A)
            fprintf(file_id,'%.4f\r\n',A(jj));
        end
        fclose(file_id);
        state = 1;
    end
    

    myplot.m

    function state = myplot(x,y)
        plot(x,y)
        state = 1;
    end
    
    

    主程序:给job1分配三个‘myplot’的task,一个‘mytxt’的task

    clc
    clear
    A = [1:10];
    clust = parcluster('local');
    job1 = createJob(clust); %开启一个job
    createTask(job1,@myplot,1,{{1:10,10:10:100},{1:10,10:10:100},{1:10,10:10:100}});%给job1分配三个‘myplot’的task
    createTask(job1,@mytxt,1,{A});%再给job1分配一个‘mytxt’的task
    get(job1,'Tasks')
    submit(job1);
    wait(job1);
    result_1 = job1.fetchOutputs;
    result_1
    delete(job1);
    
    

    然后我们可以观察到后台运行程序,由五个 MATLAB.exe,就说明由 四个task和 一个 client 在运行。一般情况下,计算量非常大的时候才考虑开启并行,数据量比较小的时候,串行其实更省时间。
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • C++多线程并行计算

    千次阅读 2020-03-11 16:41:49
    C++多线程并行计算多线程(std::thread) 多线程(std::thread) 写了一个简短的并行计算例子 存粹的利用CPU性能计算素数个数 //实现标准库头文件<numeric>中accumulate函数的并行版本 #include <iostream> ...

    C++多线程并行计算

    多线程(std::thread)

    写了一个简短的并行计算例子
    存粹的利用CPU性能计算素数个数

    //实现标准库头文件<numeric>中accumulate函数的并行版本
    #include <iostream>
    #include <thread>
    #include <numeric>
    #include <algorithm>
    #include <vector>
    #include <functional>
    #include <utility>
    #include <windows.h>
    
    
    using std::thread;
    using std::vector;
    using std::accumulate;
    using std::cout;
    using std::endl;
    
    // 被执行的函数
    template <typename Iterator, typename T> class Accum
    {
    public:
    	void operator() (Iterator first, Iterator last, T &sum)
    	{
    		sum = 0;
    
    		for (; first != last; ++first)
    		{
    			// 简单的计算素数
    			auto k = std::sqrtf(*first);
    			int i = 0;
    			for (i = 2; i <= k; i++)
    			{
    				if ((*first)%i == 0)
    				{
    					break;
    				}
    			}
    
    			if (i > k)
    			{
    				++sum;
    			}
    		}
    	}
    };
    
    // 分发任务的函数
    template <typename Iterator, typename T>
    T ParallelAccum(Iterator first, Iterator last, T &sum)
    {
    	//计算迭代器中包含的元素数量
    	const unsigned int len = std::distance(first, last);
    	//若迭代器中没有元素则直接返回
    	if (!len)
    	{
    		return sum;
    	}
    
    	//获取机器支持的并发线程数
    	const unsigned int num_thread = thread::hardware_concurrency();
    
    	//最终实际上每个线程处理的元素个数
    	const unsigned int block_size = len / num_thread;
    	//保存每个线程累加的结果
    	vector<T> results(num_thread);
    	//启动比num_thread - 1个线程,因为main函数本身已开启一个线程
    	vector<thread> threads(num_thread - 1);
    
    	//开始并行计算
    	Iterator block_begin = first;
    	for (unsigned int i = 0; i < (num_thread - 1); ++i)
    	{
    		Iterator block_end = block_begin;
    		//将迭代器向前推进一个块,到达当前块的末尾位置
    		std::advance(block_end, block_size);
    		//传递参数,通常情况下thread的构造函数将复制所提供的参数,需要将模板参数转为引用
    		threads[i] = thread(Accum<Iterator, T>(), block_begin, block_end, std::ref(results[i]));
    		block_begin = block_end;
    	}
    	//处理最后一个线程,由于block_size = len / num_thread得到的结果不一定为整数,该线程处理剩余的所有元素
    	Accum<Iterator, T>()(block_begin, last, results[num_thread - 1]);
    	//对threads中所有线程调用join()
    	std::for_each(threads.begin(), threads.end(), std::mem_fn(&thread::join));
    	//
    	return accumulate(results.begin(), results.end(), sum);
    }
    
    // 计时结构
    LARGE_INTEGER t1, t2, tc;
    
    void time_begin()
    {
    	QueryPerformanceFrequency(&tc);
    	QueryPerformanceCounter(&t1);
    }
    
    float time_end()
    {
    	QueryPerformanceCounter(&t2);
    	return ((t2.QuadPart - t1.QuadPart)*1.0 / tc.QuadPart) * 1000;
    }
    
    int main()
    {
    	// 装备任务队列
    	vector<int> i_vec;
    	int sum = 0;
    	for (int i = 1; i != 501000; ++i)
    	{
    		i_vec.push_back(i);
    	}
    
    	// 并行计算示例
    	time_begin();
    	sum = ParallelAccum(i_vec.cbegin(), i_vec.cend(), sum);
    	cout << "time: " << time_end() << ", sum = " << sum << endl;
    
    	// 一般计算示例
    	time_begin();
    	Accum<vector<int>::iterator, int> a;
    	a(i_vec.begin(), i_vec.end(), sum);
    	cout << "time: " << time_end() << ", sum = " << sum << endl;
    
    
    	return 0;
    }
    

    在这里插入图片描述

    展开全文
  • Python-多线程并行计算

    千次阅读 2017-11-21 14:44:33
    Python-多线程并行计算 饿死我了。。。。今天看图像处理cuda的时候看到了并行计算,又恰巧参加第二届CCF举办CCSP比赛的时候,第五题是可以并行计算的。。。在赛后分享上,听清华大佬讲得栩栩如生,我听得一愣一愣...
  • CPP多线程实现并行计算

    千次阅读 2015-08-22 00:31:19
    //实现并行计算 获取CPU核心个数 创建线程必须为CPU核心的个数 long long cpus = thread::hardware_concurrency(); cout 核心个数:" ; //启动线程 存储结果 使用线程分块 for (long long i = 0; i * 2; i++) ...
  • 并行计算里,所必要的硬件设备毫无疑问的就是CPU、 GPU等等 对开始本文之前,先述说一下未来多核计算的趋向性 1.单核设备的物理空间利用率已经达到很高水平,难以继续提高,即便是有量子计算机(现在技术尚不...
  • 进程 进程就是正在进行的一个程序或者任务,而负责执行任务的是CPU,执行任务的地方是内存。与程序相比,程序只是一堆代码而已,而程序运行时的过程才是进程;另外同一个程序执行两次就是两个...并行计算才是真...
  • 浅谈多核CPU、多线程并行计算

    千次阅读 2017-05-09 17:07:11
    笔者用过MPIC#线程池,参加过比赛,有所感受,将近一年来,对多线程编程兴趣一直不减,一直有所关注,决定写篇文章,算是对知识的总结吧。有说的不对的地方,欢迎各位大哥们指正:) 1.CPU发展趋势 核心数目依旧...
  • 使用多线程,幂级数方法来计算pi,方法如下。 这样就很简单了,只要把握好线程函数的计算范围即可了。 完整程序如下 // // main.cpp // pi // // Created by Yuuki on 2020/4/29. // Copyright © 2020 Yuuki. All ...
  • Python多线程能够做并行计算吗 在Python的原始解释器CPython中存在着GIL(Global Interpreter Lock,全局解释器锁),因此在解释执行Python代码时,会产生互斥锁来限制线程对共享资源的访问,直到解释器遇到I/O操作...
  • 1、对于大型数组变量,只读不写,变量作用域默认共享,在多线程并行计算的时候会不会有数据竞争的问题? 2、如果我把变量名设为私有,那么是不是每个线程只有数组头地址的副本?而数组元素仍为共享,这时候是否还...
  • 利用多线程实现加法并行计算

    千次阅读 2018-05-01 20:47:10
    前提:数据规模较小的时候,并行计算可能用时更利用Callable创建线程,可以返回值。利用future获取返回值。以下是源码:-------------------------------------------------------------------import java.util....
  • 实现多线程并行计算只需要一个工头实现类就够了,除外不需要依赖任何计算服务,这个例子位于下载包的分布式计算补充demo目录下,CtorMul .java: import com.fourinone.Contractor; import com.fourinone.WareHouse...
  • 使用Runnable接口实现并行的算法设计... 3 2.3继承Thread类实现并行的算法设计... 3 2.4 理论加速比分析... 3 3.使用Runnable接口的并行算法实现... 4 3.1 代码及注释... 4 3.2 执行结果截图... 6
  • 并行计算多线程积分法求pi

    千次阅读 2020-05-11 15:44:31
    @TOC并行计算多线程积分法求pi 第一次写博客,有点小紧张。 程序通过多线程积分方法求pi值 //线程入口函数 void *thread_function(void *arg){ int id = *(int *)arg;//arg是传入线程的参数 int piece = N/T; int...
  • 现在 先看一个 使用Runnable接口实现求数值积分的java多线程并行程序如下(电脑是四核,并行2个线程):
  • 多线程并发和并行的区别

    千次阅读 2020-09-13 14:35:34
    背景  对于java开发从业人员来说,并发编程是绕不开的话题,juc并发包下提供了一系列多线程场景解决方案。  随着jdk1.8的普及,多线程处理... 多线程并发和并行的区别   2. parallelStream()并行滥用的后果   3
  • 单线程多线程并行和并发

    千次阅读 2016-02-19 13:29:29
    单线程多线程并行和并发本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown扩展Markdown简洁的语法 代码块高亮 图片链接图片上传 LaTex数学公式 UML序列图流程图 离线写...
  • Tensorflow的并行计算:多核,多线程,图分割(Graph Partition) 利用tensorflow训练深度神经网络模型需要消耗很长时间,因为并行化计算就为提升运行速度提供了重要思路。Tensorflow提供了多种方法来使程序的并行运行,...
  • pthread多线程入门-并行计算高维向量

    千次阅读 2020-03-10 21:59:39
    介绍pthread ​ pthread其实也可以当作C/C++的一个库,所有的函数数据类型都在<pthread.h>中.跟AVX一样,如果使用了pthread,在...​ pthread就是能让C程序的进程在运行时可以分叉为线程执行.例如mai...
  • // 循环创建线程计算数字之 for (int i = 0; i ; i++) { MyThread m1 = null; if (i != count - 1) { m1 = new MyThread(nums, i * numcount, (i + 1) * numcount); } else {// 最后一个线程...
  • java多线程并行和并发

    千次阅读 2017-06-20 09:39:45
    1.并发和并行是即相似又有区别(微观概念) 并行:指两个或个事件在同一时刻点发生; 并发:指两个或个事件在同一时间段内发生。 --------------------------------------------------------------------------...
  • 用java编写两个n阶的方阵AB的相乘程序,结果存放在方阵C中,其中乘法用for编译制导语句实现并行化操作,并调节for编译制导中schedule的参数,使得执行时间最短。 方阵AB的初始值如下:

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 158,915
精华内容 63,566
关键字:

多线程和并行计算