曼德勃罗集程序
m_2013/07/06软件综合 IP:云南

Zn+1=Z2n+C,

曼德勃罗特集是易并行计算
的一个典型例子.采用分治技术,并行
算法设计时分为静态

  任务分配和动态任务分配(可用work-pool or processor farm).

  1.测试用例

  其中底部的数据(real_min, imag_min) to (real_max, imag_max)表示复平面窗口,real_min表示

  实部最小值, imag_min表示虚部最小值,real_max表示实部最大值, imag_max表示虚部最大

  值.

  (-0.84950, 0.21000) to (-0.84860, 0.21090) (0.32000, -0.45000) to (0.50000, 0.05000) (0.26304, 0.00233) to (0.26329, 0.00267)

  (-0.63500, 0.68000) to (-0.62500, 0.69000) (-0.46510, -0.56500) to (-0.46470, -0.56460) (-1.50000, -1.00000) to (0.50000, 1.00000)

  2.曼德勃罗特集的计算

  显示曼德勃罗特集是处理位映射图像的一个例子.首先要对图像进行计算,且计算量很

  大.曼德勃罗特集是复数平面中的点集,当对一个函数迭代计算时,这些点将处于准稳定状

  态(quasi-stable),即将会增加或减少,但不会超过某一限度.通常该函数为:

  zk+1 = zk

  2 + c

  式中zk+1是复数z = a + bi的第k+1次迭代,c是确定该点在复平面中位置的复数值.z的初始

  值为0.迭代将一直进行下去,直到z的幅值(向量长度,这里为22ba+)大于2或者迭代次

  数已经达到某种任意的规定的限度.

  化简计算.

  z2 = a2 - b2 + 2abi

  用zreal表示z的实部,zimag表示z的虚部.则

  zreal = a2 - b2 + creal

  zimag = 2ab + cimag

  3.顺序代码

  structure complex {

  float real;

  float image;

  };

  对一点值的计算并返回迭代次数的
例程:

  int cal_pixel(complex c)

  { int count, max;

  complex z;

  float temp, lengthsq;

  max = 256;

  XXXXal = 0;

  XXXXag = 0;

  count = 0;

  do {

  temp = XXXXal * XXXXal - XXXXag * XXXXag + XXXXal;

  XXXXag = 2 * XXXXal * XXXXag + XXXXag;

  XXXXal = temp;

  lengthsqc = XXXXal * XXXXal + XXXXag * XXXXag;

  count++;

  } while ((lengthsq < 4.0) && (count < max)); //直到z的幅值大于2或者迭代次数达到max

  return count;

  }

  因此,所有给定的曼德勃罗特点必将处在以原点为中心,半径为2的圆中.

  计算和显示这些点的代码需要对坐标系统进行一定的缩放来与显示区域的坐标系统相匹配.

  假设显示高度为disp_height,宽度为disp_width.而点在显示区域中的位置为(x, y).如果显

  示复数平面的这个窗口具有最小值(real_min, imag_min)和最大值(real_max, imag_max),则每

  个点需用以下系数加以缩放.

  XXXXal = real_min + x * (real_max - real_min) / disp_width;

  XXXXag = imag_min + y * (imag_max - imag_min) / disp_height;

  设置scale_real = (real_max - real_min) / disp_width;

  scale_imag = (imag_max - imag_min) / disp_height;

  缩放代码:

  for (x = 0; x < disp_width; x++)

  for (y = 0; y < disp_height; y++) {

  XXXXal = real_min + ((float) x * scale_real);

  XXXXag = imag_min + ((float) y * scale_imag);

  color = cal_pixel(c);

  display(x, y, color);

  }

  4.并行代码

  1)静态任务分配

  假定显示区域为640 × 480,在一个进程中要计算10行.即将10 × 640像素变为一组,共48

  个进程.为代码如下:

  主进程
Master
  for ( i = 0, row = 0; i < 48; i++, row = row + 10)

  send (&row, pi)

  for (i = 0; i < (480 * 640); i++)

  recv(&c, &color, PANY);

  display(c, color);

  }

  从进程Slave (process i)

  recv(&row, Pmaster);

  for (x = 0; x < disp_width; x++)

  for (y = row; y < (row + 10); y++) {

  XXXXal = real_min + ((float) x * scale_real);

  XXXXag = imag_min + ((float) y * scale_imag);

  color = cal_pixel(c);

  send(&c, &color, Pmaster);

  }

  改进:成组发送数据.减少通信启动次数.先将结果保存在数组中,然后以一个消息将整个

  数组发送给主进程.主进程可用一个通配符以任意顺序接收来自从进程的消息.

  2)动态任务分配—工作池/处理器农庄(work pool / processor farm)

  动态负载平衡可以用工作池方法实现.在我们的问题中,像素集(更确切应该是坐标集)构成

  了任务.任务数是固定的,要计算的像素数在计算前是已知的.各个处理器从工作池中请求

  下一个像素子集的坐标.

  主进程

  count = 0;

  row = 0;

  for (k = 0; k< procno; k++) {

  send(&row, pk, data_tag);

  count++;

  row++;

  }

  do {

  recv(&slave, &r, color, PANY, result_tag);

  count--;

  if (row 0)

  从进程

  recv(y, Pmaster, ANYTAG, source_tag); //接收Pmaster发送的第y行的点

  while(source_tag == data_tag) { //判断是否还有消息需要处理

  XXXXag = imag_min + ((float) y * scale_imag);

  for (x = 0; x < disp_width; x++) {

  XXXXal = real_min + ((float) x * scale_real);

  color = cal_pixel(c);

  }

  send(&i, &y, color, Pmaster, result_tag); //将所计算的第y行点的color发给Pmaster

  recv(y, &r, Pmaster, source_tag); //接收下一任务

  } //如果退出while循环, 则一定是source_tag = termiate_tag, 表明没有任务,程序终止


-1  科创币    celeron533    2013/07/07 复制粘贴谁都会 http://baike.baidu.com/view/1777568.htm,若能解释清楚,取消扣分并加分。
-4  科创币    相对论万岁    2013/07/07 转载未注明
来自:计算机科学 / 软件综合
4
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
石峻峰
11年6个月前 IP:未同步
544850
RTRTRTRT
我也写过【别人的代码调试…然后然后…[s:214]      】…虽然是别人的代码…但也有部分私自改过……献丑了……[s:215]    
晒一下~


最后一张…把CPU卡到爆才出来的……(没传上来)


妈的……电脑太卡了,几次都没传上来,干脆不来了

1212112.jpg

11.png

111.jpg 1111.png
11111.png
121.png
+5
科创币
阿飘先生
2013-07-07
这是如何做到的? 求指点啊
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
celeron533
11年6个月前 IP:未同步
544856
复制粘贴谁都会 XXXXXXXXXXXXXXXXXXXXXX/view/XXXXXXXXXXm,若能解释清楚,取消扣分并加分。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
光谱
11年6个月前 IP:未同步
544871
回 1楼(石峻峰) 的帖子
分形???
字数补丁。dll
+1
科创币
kokming999
2013-07-07
yes
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}