使用 openmp 优化 N-queen

2024-04-20

我正在学习 OPENMP 并编写以下代码来解决 n 皇后问题。

//Full Code: https://github.com/Shafaet/Codes/blob/master/OPENMP/Parallel%20N-  Queen%20problem.cpp
int n;

int call(int col,int rowmask,int dia1,int dia2)
{
    if(col==n) 
    {
        return 1;

    }
    int row,ans=0;
    for(row=0;row<n;row++)
    {
        if(!(rowmask & (1<<row)) & !(dia1 & (1<<(row+col))) & !(dia2 & (1<<((row+n-1)-col))))
        {           
            ans+=call(col+1,rowmask|1<<row,dia1|(1<<(row+col)), dia2|(1<<((row+n-1)-col)));
        }
    }
    return ans;

}

double parallel()
{
    double st=omp_get_wtime();
    int ans=0;
    int i;
    int rowmask=0,dia1=0,dia2=0;
     #pragma omp parallel for reduction(+:ans) shared(i,rowmask)
    for(i=0;i<n;i++)
    {
        rowmask=0;
        dia1=0,dia2=0;
        int col=0,row=i;
        ans+=call(1,rowmask|1<<row,dia1|(1<<(row+col)), dia2|(1<<((row+n-1)-col)));
    }
    printf("Found %d configuration for n=%d\n",ans,n);
    double en=omp_get_wtime();
    printf("Time taken using openmp %lf\n",en-st);
    return en-st;

}
double serial()
{

    double st=omp_get_wtime();
    int ans=0;
    int i;
    int rowmask=0,dia1=0,dia2=0;
    for(i=0;i<n;i++)
    {
        rowmask=0;
        dia1=0,dia2=0;
        int col=0,row=i;
        ans+=call(1,rowmask|1<<row,dia1|(1<<(row+col)), dia2|(1<<((row+n-1)-col)));
    }
    printf("Found %d configuration for n=%d\n",ans,n);
    double en=omp_get_wtime();
    printf("Time taken without openmp %lf\n",en-st);
    return en-st;

}
int main()
{
    double average=0;
    int count=0;
    for(int i=2;i<=13;i++)
    {
        count++;
        n=i;

        double stime=serial();
        double ptime=parallel();
        printf("OpenMP is %lf times faster for n=%d\n",stime/ptime,n);
        average+=stime/ptime;
        puts("===============");
    }
    printf("On average OpenMP is %lf times faster\n",average/count);
    return 0;

}

并行代码已经比普通代码更快,但我想知道如何使用 openmp pragmas 对其进行更多优化。我想知道为了更好的表现我应该做什么以及不应该做什么。

提前致谢。

(请不要提出任何与并行编程无关的优化)


您的代码似乎使用经典的回溯 N-Queens 递归算法,这不是 N-Queens 求解最快的算法,但(由于简单)是最快速的vivid一是练习并行性基础知识。 也就是说:这非常简单,因此您不会期望它自然地展示除基本的“并行”和缩减之外的许多高级 OpenMP 方法。

但是,就你所寻找的而言learning并行性并且可能为了更清晰和更好的学习曲线,还有一种(在许多可能的)实现可用,它使用相同的算法,但从教育角度来看往往更具可读性和生动性:

void setQueen(int queens[], int row, int col) {
//check all previously placed rows for attacks
for(int i=0; i<row; i++) {
   // vertical attacks
   if (queens[i]==col) {
       return;
   }

   // diagonal attacks
   if (abs(queens[i]-col) == (row-i) ) {
      return;
   }
}

// column is ok, set the queen
queens[row]=col;
if(row==size-1) {
#pragma omp atomic
    nrOfSolutions++;  //Placed final queen, found a solution
}
else {
     // try to fill next row
     for(int i=0; i<size; i++) {
         setQueen(queens, row+1, i);
     }
}
}

//Function to find all solutions for nQueens problem on size x size chessboard.
void solve() {
#pragma omp parallel for
    for(int i=0; i<size; i++) {
         // try all positions in first row
         int * queens = new int[size];  //array representing queens placed on a chess board.  Index is row position, value is column.
         setQueen(queens, 0, i);
         delete[](queens);
     }
}

这个给定的代码是其中之一英特尔顾问 XE http://software.intel.com/en-us/intel-advisor-xe示例(适用于 C++ 和 Fortran);给定示例的并行化方面在给定示例的第 10 章中进行了非常详细的讨论并行编程书籍 http://www.amazon.co.uk/Parallel-Programming-Intel-Studio-Programmer/dp/0470891653(事实上​​,给定的章节只是使用 N-Queens 来演示如何使用工具来并行化串行代码一般来说).

给定的 Advisor n-queens 示例使用与您的算法基本相同的算法,但它用简单的并行 for + 原子组合替换了显式约简。该代码预计效率较低,但更具“程序风格”和更多“教育性”,因为它演示了“隐藏”数据竞争。如果您上传给定的示例代码,您实际上会发现 4 个使用 TBB、Cilk Plus 和 OpenMP(OMP 适用于 C++ 和 Fortran)的等效 N-Queens 并行实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 openmp 优化 N-queen 的相关文章

  • 并行处理 - 池 - Python

    我正在尝试学习如何在 Python 中使用多重处理 我读到多重处理 http docs python org 2 library multiprocessing html 我尝试做这样的事情 我有以下类 部分代码 它有一个生成 vorono
  • 距离矩阵的并行构造

    我对大量多维向量进行层次凝聚聚类 我注意到最大的瓶颈是距离矩阵的构造 此任务的简单实现如下 此处使用 Python v an array N d where rows are the observations and columns the
  • MPI_Type_create_subarray 和 MPI_Gather

    我必须解决一些 mpi 问题 我有 4 个从进程 每个进程都想发送一个 2d 子数组 CHUNK ROWS X CHUNK COLUMNS 到 master 0 Master 0 收集 ddd ROWS COLUMNS 中的所有块并打印它
  • 为什么 Spark 在字数统计时速度很快? [复制]

    这个问题在这里已经有答案了 测试用例 Spark 在 20 秒以上对 6G 数据进行字数统计 我明白映射减少 FP and stream编程模型 但无法弄清楚字数统计的速度如此惊人 我认为这种情况下是I O密集型计算 不可能在20秒以上扫描
  • 是否可以使用多处理对一个 h5py 文件进行并行读取?

    我正在尝试加快从 h5py 数据集文件中读取块 将它们加载到 RAM 内存中 的过程 现在我尝试通过多处理库来做到这一点 pool mp Pool NUM PROCESSES gen pool imap loader indices 加载器
  • 打破parallel.foreach?

    我怎样才能摆脱困境并行 for http msdn microsoft com en us library system threading tasks parallel for aspx loop 我有一个非常复杂的声明 如下所示 Par
  • 使用 openmp 优化 N-queen

    我正在学习 OPENMP 并编写以下代码来解决 n 皇后问题 Full Code https github com Shafaet Codes blob master OPENMP Parallel 20N Queen 20problem
  • SPMD 与 Parfor

    我对 matlab 中的并行计算很陌生 我有一个创建分类器 SVM 的函数 我想用几个数据集来测试它 我有一个 2 核工作站 所以我想并行运行测试 有人可以向我解释一下以下之间的区别 dataset array dataset1 datas
  • TransactionScope() 和并行查询执行

    我们尝试在事务范围内运行并行查询以提高代码的性能 我们要在数据库中进行几项彼此没有连接的更改 我们可以这样运行代码 using var tran new System Transactions TransactionScope await
  • parApply 中的错误处理(在 R 中,使用并行包)

    我正在尝试解决尝试使用时收到的以下消息parApply函数从parallel包裹 Error in unserialize node con error reading from connection 以下是我正在做的事情的模型 c0 lt
  • 并行框架和避免错误共享

    最近 我回答了一个关于优化可能的并行方法来生成任意基数的每个排列的问题 我发布了类似的答案并行化 实施不佳代码块列表 有人几乎立即指出了这一点 这几乎肯定会给你带来错误的共享 并且可能会慢很多倍 归功于gjvdkamp https stac
  • Julia:如何让多个工作人员访问模块中的函数?

    我有以下测试模块 MyMod jl 来在 Julia 中存储一些测试函数 一些核心函数是串行编写的 其他函数并行调用核心函数 module MyMod export Dummy distribute data getfrom recombi
  • 线程与并行处理

    Microsoft NET 4 0 为其框架引入了新的 并行增强功能 我想知道使用标准 System Threading 函数与新的并行增强功能创建应用程序之间有什么区别 并行扩展和常规线程之间最重要的区别可能是控制流 一个线程 使用创建n
  • shell进程的并行执行

    有没有一个工具可以在 Windows 批处理文件中并行执行多个进程 我发现了一些有趣的 Linux 工具 parallel http mi eng cam ac uk er258 code parallel html and PPSS ht
  • 将 R 包函数导出到 R 包内的并行集群

    有一些功能 比如function1 在我正在开发的 R 包中 它依赖于辅助函数 例如h function1 and h function2 在我的包裹里 我正在并行化重复调用function1在我的包中的另一个函数中 目前 在我的包中我正在
  • python 线程是如何工作的?

    我想知道 python 线程是并发运行还是并行运行 例如 如果我有两个任务并在两个线程中运行它们 它们是同时运行还是计划同时运行 我知道GIL并且线程仅使用一个 CPU 核心 这是一个复杂的问题 需要大量解释 我将坚持使用 CPython
  • 单机Octave并行计算——包和示例

    我想在单台机器 而不是集群 上并行化 Octave 中的 for 循环 前段时间我问了一个关于Octave并行版本的问题Octave并行计算 https stackoverflow com questions 7047840 paralle
  • OpenMP 线程映射到物理内核

    于是我在网上查了一段时间没有结果 我是 OpenMP 的新手 所以不确定这里的术语 但是有没有办法从 OMPThread 由 omp get thread num 给出 和线程将运行的物理核心找出特定机器的映射 我还对 OMP 分配线程的精
  • 使用 AppDomains 并行化非线程安全 DLL

    我有一个非托管 C DLL 我的 NET 应用程序通过 p invoke 使用它 我从这个 DLL 中需要的方法相当耗时 我想并行化方法调用 问题是它使用了一堆静态和全局变量 因此它不是线程安全的 并且无法更改 我的计划是通过从多个 App
  • 并行模拟写入同一文件

    我的目标是在集群上并行运行 10 000 个左右的 Julia 编码模拟 每个模拟独立于所有其他模拟 每个模拟都有一个要输出的数字 以及有关哪个模拟产生该数字的 3 列信息 因此 强制每个模拟打印在单独的文件上对我来说听起来有点愚蠢 我可以

随机推荐

  • 如果磁盘可用空间很少,如何优化 9GB 表?

    我在 12GB 磁盘上有一个 9GB myisam 表 有 5MB 可用空间 我如何optimize桌子 问题是OPTIMIZE通过将整个表复制到一个新文件来工作 因此我需要 9GB 的可用空间才能成功 我能想到的唯一解决方案是 停止在桌子
  • 使用正则表达式验证英国邮政编码

    我想用英国邮政编码验证字段 可以使用什么正则表达式来验证该字段 A Z 1 2 0 9 0 9A Z 0 1 0 9 A Z 2 GIR 0AA 确实显得有效 因为它有例外GIR 0AA 所以 请帮我写一个没有任何异常的表达式 如果你指的是
  • 如何注册新的payum支付方式并添加操作?

    我创建了一个 payum 付款方式 我设置了一个存储付款详细信息的付款表单 然后生成付款安全令牌 到目前为止 一切似乎都正常 payum 会在存储中生成令牌 但是 我似乎无法注册它 我不知道应该在哪里添加操作 以便在加载付款方式时使用它们
  • 如何同时循环多个数组(并行)

    好吧 我不知道为什么这这么难 我找到的所有信息仅适用于像 array combine 这样的两个数组 我有 3 个从表单中动态创建的输入字段获取的数组 所以现在我想检索数据并将其打印出来 如下所示 Item1 array1 Item1 ar
  • 如何在 Flutter 中对文本的 fontSize 进行动画处理?

    有什么方法可以动画增加 减少fontSize in a Text widget 可能更简单的解决方案是使用AnimatedTextStyle double size 10 override Widget build BuildContext
  • 如何将 HTML 代码导入到 JSF 页面?

    我正在尝试导入这个page http dl dropbox com u 5714646 Highcharts 2 2 0 examples pie donut index htm到我的 JSF 页面 该页面将有数据库来获取数据 以更具交互性
  • Rabl、Jbuilder 或手动 json 构建 api?

    要为大规模应用程序构建 api 就性能而言 哪种方法更好 我应该使用 Rabl Jbuilder 还是手动构建 json 对象 我正在为移动应用程序构建 api endpoints 在性能方面 您应该尝试创建一些基本的性能测试 并对它们进行
  • 无法在同一查询中运行 Insert 和 Select LAST_INSERT_ID() 吗?

    我正在使用节点连接到 mysql 我需要运行插入 然后立即运行 select last insert id insert into data temp values null test id 12 otherdata x otherdata
  • OpenCV(C++/Qt)-cornerSubPix 错误

    Hello 我在使用 imgproc hpp 文件中的cornerSubPix 方法时遇到问题 我不明白缺少哪个库或者有什么错误 我在 OS X 10 10 3 上使用 Qt 5 4 1 并使用 OpenCV 3 0 0 C 库 这是我的代
  • 在 PHP 的 require_once 中使用查询字符串

    在我的其中一个页面上有一个require once path to url page php 没有任何问题 当我添加查询字符串时require once path to url page php var test 它将不再包含该文件 只是一
  • Web 应用程序的计划任务

    为 Web 应用程序创建计划任务 无论是否有单独的 Web 桌面应用程序 有哪些不同的方法 如果我们谈论的是 Microsoft 平台 那么我总是会开发一个单独的 Windows 服务来处理此类批处理任务 您始终可以引用 Web 应用程序正
  • 无法在 Scala 中使用 Apache Commons CLI Option.builder()

    在 Spark shell 或应用程序 用 Scala maven 构建编写 中 我无法使用 Apache Commons CLI 包中的静态构建器方法 我已确认我将 jar 包含在类路径中并且可以访问Option类以及包中的其他类 例如O
  • 我可以将 jQuery UI 对话框置于 div 中心吗?

    我有一个主要内容 div 我想将对话框置于该 div 的中心 而不是页面的中心 有任何想法吗 我知道有一个位置实用程序 但我不知道如何将它与对话框位置选项一起使用 你是对的 position http jqueryui com demos
  • 将 hibernate 投影结果映射到 java POJO 模型

    在过去的几周里 我一直在使用 spring 和 hibernate 并且我一直在那里学习新的东西 现在我有一个问题想用 Hibernate 中的投影来解决 假设有一个模型Person这个模型有很多Car 以下是类定义的大致样子 public
  • 计算机状态(睡眠、休眠、锁定等) Windows 10

    我需要检查当前状态 计算机的 休眠 睡眠 待机锁定等 我只是想问一下如何使用C 获取我的计算机的当前状态 我已经通过检测 LockApp 进程知道计算机何时被锁定 但我无法知道它是否处于睡眠模式或休眠模式 我想尝试一个将使用任务计划程序运行
  • Solr 管理控制台中模式浏览器屏幕中的字段

    上面是特定索引的架构浏览器屏幕的屏幕截图 该字段是品牌 字段类型定义如下
  • 属性“user”在类型“Request>”上不存在

    请帮助 我收到此错误 src app middlewares authentication ts 16 17 error TS2339 Property user does not exist on type Request
  • css 旋转与过渡似乎会影响其他元素的不透明度?

    我遇到了使用 1s 过渡通过 CSS3 变换旋转 DIV 的问题 在 OSX 10 7 5 上的 Chrome 23 和 Safari 6 中 在 rotate divs 转换期间 其他容器中的字体会稍微变暗 关于造成这种情况的原因以及如何
  • 当前位置权限对话框消失得太快

    我的应用程序获取用户位置 获取坐标 并提供往返目的地或出发地的距离 所有这些可能的目的地都显示在表格视图中 因此我在填充表格的同时获取用户坐标 唯一的问题是 询问用户位置的警报视图出现然后消失得如此之快 以至于无法单击它 有什么方法可以在应
  • 使用 openmp 优化 N-queen

    我正在学习 OPENMP 并编写以下代码来解决 n 皇后问题 Full Code https github com Shafaet Codes blob master OPENMP Parallel 20N Queen 20problem