`
bjxagu
  • 浏览: 162216 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

用Parallel_For进行并行快速排序

阅读更多

注:本文主要内容摘自笔者所著的《多核计算与程序设计》一书,略有修改,后续还会继续发布系列文章,如有需要,可以考虑将一下地址加入到您的浏览器收藏夹中:http://software.intel.com/zh-cn/blogs/category/multicore/

 

上一篇文章 用动态任务调度器实现Parallel_For 中,实现了Parallel_For()功能, Parallel_For()可以实现许多的并行区间处理功能,下面以并行快速排序为例来讲解如何使用Parallel_For()的功能。

要用Parallel_For()来进行并行快速排序,需要先继承CRange类来实现一个CQuickSortRange类,然后就可以将CQuickSortRange类的实例作为参数传给Parallel_For()进行并行快速排序。

CQuickSortRange类的定义如下:

template <class T>

class CQuickSortRange : public CRange {

private:

    T * m_pData;

    int  m_nBegin;

    int  m_nEnd;

public:

    CQuickSortRange(T *pDataArray, int nBegin, int nEnd);

    virtual CRange * Split();

};

 

CQuickSortRange类中,主要需要实现Split()功能。考虑到效率,当区间小于一定值时就用串行的快速排序来对区间进行排序,否则将区间拆分成两个更小的区间。

Split()的代码实现如下:

#define MIN_QUICKSORT_SIZE      512

 

template <class T>

CRange * CQuickSortRange<T>::Split()

{

    if ( m_nEnd - m_nBegin <= MIN_QUICKSORT_SIZE )

    {

        QuickSort(m_pData, m_nBegin, m_nEnd);

        return NULL;

    }

 

    int nMid = QuickSort_Split(m_pData, m_nBegin, m_nEnd);

 

    CQuickSortRange<T> *pRange = new CQuickSortRange<T>(m_pData, nMid+1, m_nEnd);

 

    m_nEnd = nMid - 1;

 

    return pRange;

}

 

Split()功能中,调用了QuickSort()函数和QuickSort_Split()函数,这两个函数的代码如下:

template <class T>

int QuickSort_Split(T *pData, int nBegin, int nEnd)

{

    T SelData;

    int nLow;

    int nHigh;

 

    nLow = nBegin;

    nHigh = nEnd;

 

    SelData = pData[nLow];

    while ( nLow < nHigh )

    {

        while ( (pData[nHigh] > SelData)  && (nLow != nHigh) )

        {

            --nHigh;

        }

        if ( nHigh != nLow )

        {

            pData[nLow] = pData[nHigh];

            ++nLow;

        }

 

        while ( ( pData[nLow] < SelData ) && (nLow != nHigh) )

        {

            ++nLow;

        }

        if ( nLow != nHigh )

        {

            pData[nHigh] = pData[nLow];

            --nHigh;

        }

    }

    pData[nLow] = SelData;

 

    return nLow;

}

 

template <class T>

void QuickSort(T *pData, int nBegin, int nEnd)

{

    int nMid = QuickSort_Split(pData, nBegin, nEnd);

    if ( nMid > nBegin )

    {

        QuickSort(pData, nBegin, nMid - 1);

    }

 

    if ( nEnd > nMid )

    {

        QuickSort(pData, nMid + 1, nEnd);

    }

}

 

下面代码演示了如何使用Parallel_For()CQuickSortRange类来进行快速排序。

#define QUICKSORT_DATA_SIZE     1000000

 

void main(void)

{

    int * pData = new int[QUICKSORT_DATA_SIZE];

 

    srand(time(NULL));

 

    int i;

    for (i = 0; i < QUICKSORT_DATA_SIZE; i++ )

    {

        pData[i] = rand();

    }

CQuickSortRange<int> *pRange

= new CQuickSortRange<int>(pData, 0, QUICKSORT_DATA_SIZE-1);

Parallel_For(pRange);

 

delete [] pData;

}

 相关的多核文章:

在一个双核2.66G CPU机器上,测试了100万个随机数的串行快速排序和并行快速排序,得到的性能情况大致如下(由于存在随机性,每次测试得到的时间可能有差距):

 

串行快速排序100万个随机数, 耗时 187ms

并行快速排序100万个随机数, 耗时 94ms

 

加速比为187 / 94 = 1.989

效率为:1.989 / 2 = 99.46%

 

从上面的性能数据可以充分看出,使用动态任务调度进行并行算法的效率之高是非常令人兴奋的。

分享到:
评论

相关推荐

    分布式锁与信号量:同步机制的探讨与实践.pdf

    在分布式系统中,同步机制是确保多个进程或线程协调工作、避免数据竞争和死锁等问题的关键技术。分布式锁和信号量作为两种常见的同步机制,在许多分布式应用场景中发挥着重要作用。本文将深入探讨分布式锁与信号量的原理、特点、应用场景以及它们之间的异同点,并通过实际案例分析它们在分布式系统中的应用效果。 分布式锁是一种允许多个进程或线程在分布式环境中对共享资源进行互斥访问的同步机制。它的工作原理基于分布式协调服务,如ZooKeeper、Redis等,这些服务提供了一致性的数据存储和同步机制。分布式锁的主要特点包括:

    ASP.NET基于WEB的工作计划流程管理系统的设计与实现(源代码+论文)【ASP】.zip

    ASP.NET基于WEB的工作计划流程管理系统的设计与实现(源代码+论文)【ASP】

    cryptography-3.4-cp36-abi3-macosx_10_10_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    基于Java的吉首大学假期留校工作系统(源码+论文+需求分析+数据库文件+演示视频).zip

    本基于Web技术的B/S结构的系统采用jsp技术进行开发设计,开发环境是MyEclipse,服务器采用tomcat,通过jdbc驱动和数据库进行无缝连接,具有较高的完整性,一致性和安全性。 学生:登录之后,申请留校查看自己的申请记录 修改个人信息 辅导员:审核 查看申请记录 修改个人信息 院级管理员:审核辅导员通过得记录 查看申请记录 修改个人信息宿舍管理员:对审核通过的给予宿舍住宿登记,查看住宿登记记录

    html bootstrap前端样式代码大全

    html bootstrap前端样式代码大全

    ASP.NET+SQL Sever2005 C语言教学网站及网上考试系统的设计与实现(论文+源代码+开题报告)【ASP】.zip

    ASP.NET+SQL Sever2005 C语言教学网站及网上考试系统的设计与实现(论文+源代码+开题报告)【ASP】

    基于ASP的公交查询系统的设计与实现(源代码+论文)【ASP】.zip

    基于ASP的公交查询系统的设计与实现(源代码+论文)【ASP】

    intel_openmp-2023.1.0-py2.py3-none-win32.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    高空抛物视频+视频帧抽取代码.zip

    高空抛物视频+视频帧抽取代码.zip

    springboot的小程序商城系统(源码+论文)高分毕设

    基于springboot+微信小程序的商城系统 开发环境: springboot+Idea+jdk1.8+ 数据库: mysql 是否使用maven: 使用 购物系统设计的设计主要是对系统所要实现的功能进行详细考虑,确定所要实现的功能后进行界面的设计,在这中间还要考虑如何可以更好的将功能及页面进行很好的结合,方便用户可以很容易明了的找到自己所需要的信息,还有系统平台后期的可操作性,通过对信息内容的详细了解进行技术的开发。

    SecureCRT 模拟器,免安装

    SecureCRT 模拟器,免安装

    "链接器:程序中必不可少的关键组成部分

    链接器 二、链接器主要任务: GNU ld(链接器)是用于将多个目标文件(包括目标文件、共享库、目标文件的归档文件等)合并成一个可执行文件或共享库的重要工具。它的主要功能包括:符号解析和重定位:链接器识别并解析输入文件中的符号引用,然后执行重定位操作以确保这些引用指向正确的地址。这包括将模块中的符号引用与其定义进行匹配,以便在合并时连接它们。 合并输入文件:链接器将多个输入文件中的代码段、数据段等模块合并成一个单一的地址空间。这包括将不同模块中的代码和数据安排到正确的内存地址中。 生成输出文件:链接器将合并的模块和符号表等信息写入输出文件中,该输出文件可以是可执行文件、共享库、目标文件等,具体类型取决于链接器的参数和配置。 符号表处理:链接器生成输出文件的符号表,其中包含了可供调试和动态链接器使用的符号信息。 处理重定位信息:如果存在重定位信息,链接器将生成重定位表,用于在加载时修正代码和数据的地址。这使得程序可以在不同的内存地址上运行。 处理链接器脚本:链接器可以根据链接器脚本(linker script)中的规则和指令来组织和排列模块,以满足特定需求。链接器脚本可以

    cryptography-37.0.1-cp36-abi3-win32.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    pyzmq-25.1.2-cp39-cp39-macosx_10_15_universal2.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    网络安全network-security-mind-map.zip

    【资源简介】 第一章 网络安全概述 第二章 扫描与防御技术 第三章 网络监听及防御技术 第四章 口令破解与防御技术 第五章 欺骗攻击及防御技术 第六章 拒绝服务攻击与防御技术 第七章 缓冲区溢出攻击及防御技术 第八章 Web攻击及防御技术 第九章 木马攻击与防御技术 第十章 计算机病毒 第十一章 网络安全发展及未来

    基于Python实现的英雄联盟知识图谱的问答

    【作品名称】:基于Python实现的英雄联盟知识图谱的问答 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 说明 spider.py:爬取数据,可参考,但这里并没有使用。 build_lol_graph.py:构建知识图谱 question_classification:给定问题,识别里面的实体以及问题的类型。 question_parser.py:根据问题类型生成neo4j的sql语句。 answer_search.py:执行sql并构建返回的结果。 chatbot_graph.py:程序的主入口。 依赖 py2neo版本:py2neo-2021.2.3 neo4j版本:neo4j-4.4.5

    网络TCP/IP如何创建网站 用途创建一个网站

    如何创建一个属于自己网站,可在conn.sendall(b'HTTP/1.1 200 OK\r\n\r\nHello,world')修改Hello world改变网站中的内容,运行程序后在浏览器中输入127.7.5.3:8080即可访问,这是Python代码

    基于Python+tkinter+MySQL的图书管理系统+设计报告+PPT(课程设计高分项目).zip

    基于Python+tkinter+MySQL的图书管理系统+设计报告+PPT(课程设计高分项目).zip个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做课程设计大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业,有实力的也可以进行二次开发。 基于Python+tkinter+MySQL的图书管理系统+设计报告+PPT(课程设计高分项目).zip个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做课程设计大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业,有实力的也可以进行二次开发。 基于Python+tkinter+MySQL的图书管理系统+设计报告+PPT(课程设计高分项目).zip个人经导师指导并认可通过的高分设计项目,评审分98分。主要针对计算机相关专业的正在做课程设计大作业的学生和需要项目实战练习的学习者,可作为课程设计、期末大作业,有实力的也可以进行二次开发。 基于Python+tkinter+MySQL的图书管理系统+设计报告+PPT(课程设计高分项目).zip个人经导

    ASP.NET报名管理信息系统(源代码+论文+开题报告+任务)【ASP】.zip

    ASP.NET报名管理信息系统(源代码+论文+开题报告+任务)【ASP】

    Scratch 经典游戏:星球大战:战斗前线.sb3

    作品比较大, 加载有点慢,请耐心等待,这是一部值得你深玩的游戏。 星球大战:战斗前线是一款动作 / 射击游戏,让粉丝和玩家有机会前所未有地重新体验和参与经典的星球大战战斗。 以士兵的身份在前线战斗,或者以飞行员的身份登上天空! 模式包括首都至上、银河突击和打击以及星际战斗机模式星际战斗机突击和首都飞船突击! 与敌军对战,配合我军一举歼灭敌军,围剿他们,挫败他们的侵略行动。 SJA 分析数据: · 代码数量: 代码总数:8969 ,有效代码:8863 ,代码块:454 ; · 高级编辑: 扩展种类:1 ,函数定义:52 ,变量 & 列表定义:247 ; · 资源数量: 角色数:57 ,造型数量:781 ,音频数量:173 ; · 资源大小: 工程大小:104.3MB ,音频大小:39.3MB ,造型大小:60.9MB 。 此后仍有作品或有趣游戏,可以进行学习与借鉴。请关注作者,且点赞加收藏,记得推荐好友。下载即可游玩,快来下载吧!五星好评可以私信我,免费送资源!快来评论吧!

Global site tag (gtag.js) - Google Analytics