h**********c 发帖数: 4120 | 1 问题是这样的.
我的机器是vista 32,q 6600 单CPU
大概有两亿个左右的任务,互相独立,其实都是简单的数学运算.
我首先用最普通的c++ 写了个单线程程序,跑了大概994.77100秒.
然后照着一个msdn上的例题,改为3个线程,跑了1729.13400秒;
6个线程,1756.93700秒.
问题:
1.怎么解释这一现象,多线程反倒慢了?
2.程序贴在楼下,请高人帮分析分析,如何优化,还是vista对这种问题已经优化,多线程
是没有必要的?
3.如果是多个cpu的话,多线程程序能否就会比单线程快?
有没有什么软件能模拟多个cpu环境?
搞科学计算没办法.多个cpu的机器太贵.
谢谢! | h**********c 发帖数: 4120 | 2 \\单线程程序
#include
#include
#include
#include
#include
void parsePermutation (int n, int m, int * rindx,int *results) {
int * data = new int[n];
int i =0,j=0;
for (i=0; i
data[i] = i+1;
for (i=0; i
results[i] = data[rindx[i]-1];
for (j=rindx[i]-1; j
data[j] = data[j+1];
}
}
delete [] data; data = NULL;
}
bool getXs(int n,int *inputs, int * rs) {
bool | h**********c 发帖数: 4120 | 3 //多线程程序,改自MSDN
#include
#include
//#include "Thread.h"
#include
#include
#include
#include
#include
//for timer
#include
#include
#include
#define MAX_THREADS 6
#define BUF_SIZE 255
///////////////////////////////////////////
void parsePermutation (int n, int m, int * rindx,int *results) {
int * data = new int[n];
int i =0,j=0;
for (i=0; i
data[i] = i+1;
for (i= | z*****n 发帖数: 7639 | 4 what about the result in XP, linux?
【在 h**********c 的大作中提到】 : 问题是这样的. : 我的机器是vista 32,q 6600 单CPU : 大概有两亿个左右的任务,互相独立,其实都是简单的数学运算. : 我首先用最普通的c++ 写了个单线程程序,跑了大概994.77100秒. : 然后照着一个msdn上的例题,改为3个线程,跑了1729.13400秒; : 6个线程,1756.93700秒. : 问题: : 1.怎么解释这一现象,多线程反倒慢了? : 2.程序贴在楼下,请高人帮分析分析,如何优化,还是vista对这种问题已经优化,多线程 : 是没有必要的?
| h**********c 发帖数: 4120 | 5 1. I don't have XP available.
2. Later I will try linux.
【在 z*****n 的大作中提到】 : what about the result in XP, linux?
| s*x 发帖数: 3328 | 6 一个cpu,跑多线程,时间应该是越来越多,光是载入载出开销就不小。
【在 h**********c 的大作中提到】 : 问题是这样的. : 我的机器是vista 32,q 6600 单CPU : 大概有两亿个左右的任务,互相独立,其实都是简单的数学运算. : 我首先用最普通的c++ 写了个单线程程序,跑了大概994.77100秒. : 然后照着一个msdn上的例题,改为3个线程,跑了1729.13400秒; : 6个线程,1756.93700秒. : 问题: : 1.怎么解释这一现象,多线程反倒慢了? : 2.程序贴在楼下,请高人帮分析分析,如何优化,还是vista对这种问题已经优化,多线程 : 是没有必要的?
| l********o 发帖数: 33 | 7 不太擅长多线程,没看代码瞎扯几句:如果你的线程体只是简单运算,那就要看看线程
管理的开销,如果是独立的任务,不要做同步的管理,否则线程会在主线程里面干等。
多线程你还是得试一试unix下的编程,另外如果不是做服务器为什么你要用多线程在单
机上做这个事情呢?
【在 h**********c 的大作中提到】 : 问题是这样的. : 我的机器是vista 32,q 6600 单CPU : 大概有两亿个左右的任务,互相独立,其实都是简单的数学运算. : 我首先用最普通的c++ 写了个单线程程序,跑了大概994.77100秒. : 然后照着一个msdn上的例题,改为3个线程,跑了1729.13400秒; : 6个线程,1756.93700秒. : 问题: : 1.怎么解释这一现象,多线程反倒慢了? : 2.程序贴在楼下,请高人帮分析分析,如何优化,还是vista对这种问题已经优化,多线程 : 是没有必要的?
| h**********c 发帖数: 4120 | 8 在科学计算中,符合某些特征的sparse matrices,可以分块进行多路处理,
这个在linux下,多cpu的performance提高相当大的,(老板有一个东西,他的博后用
fortran写的mpi).
linux 多核,也提高很大,我观察过,在linux下,单线程只有一个核在跑,老板的的东西运
行时,四个核都在跑.(梢后我会把上面的程序在linux上再试验试验).
这样的程序我没写过,想试验一下,大体的思路就是让独立的运算让每个核承担一部分,
for vista我观察system monitor,单线程的时候,四个核都在跑,但每个都不满,多线程
的时候,四个核也都在跑,而且跑满了,那么说明,vista只是简单把运算平均分给各个核,
但多核用来context switch(thread 不知道是不是context switch)的开销thread越多
越大.
看来最初想法和具体的架构有相当的出入.
【在 l********o 的大作中提到】 : 不太擅长多线程,没看代码瞎扯几句:如果你的线程体只是简单运算,那就要看看线程 : 管理的开销,如果是独立的任务,不要做同步的管理,否则线程会在主线程里面干等。 : 多线程你还是得试一试unix下的编程,另外如果不是做服务器为什么你要用多线程在单 : 机上做这个事情呢?
| x**y 发帖数: 10012 | 9 一个cpu的话
你就得考虑线程建立和终止的开销了
因为只有一个cpu
多线程没有特别大价值
【在 h**********c 的大作中提到】 : 问题是这样的. : 我的机器是vista 32,q 6600 单CPU : 大概有两亿个左右的任务,互相独立,其实都是简单的数学运算. : 我首先用最普通的c++ 写了个单线程程序,跑了大概994.77100秒. : 然后照着一个msdn上的例题,改为3个线程,跑了1729.13400秒; : 6个线程,1756.93700秒. : 问题: : 1.怎么解释这一现象,多线程反倒慢了? : 2.程序贴在楼下,请高人帮分析分析,如何优化,还是vista对这种问题已经优化,多线程 : 是没有必要的?
| k********e 发帖数: 702 | 10 拜托。Q6600是4核 CPU的嘛,当4个 CPU用的
有点基础知识好不好。个 个 都在说单CPU怎样怎样 ... | | | x**y 发帖数: 10012 | 11 windows没对多核cpu进行优化
so...
用一下多核的linux吧
这下明白了?
【在 k********e 的大作中提到】 : 拜托。Q6600是4核 CPU的嘛,当4个 CPU用的 : 有点基础知识好不好。个 个 都在说单CPU怎样怎样 ...
| l***e 发帖数: 450 | 12 did not have time to look into your program, but generally speaking, unless
your thread has blocking calls (waiting for something else, for example,
disk, i/o, etc), multiple threads working on the task set on a single cpu is
always slower than single thread working on the same task set because of the overhead of swapping in and out threads (register swap, L2 cache pollution, etc)
the maximum parallelism you can get is the number of CPUs in the system.
With one CPU, there is really no advantage | x**y 发帖数: 10012 | 13 人家是四核。。。
最关键是windows没对多核cpu做优化
其实当成一个在用
unless
is
the
【在 l***e 的大作中提到】 : did not have time to look into your program, but generally speaking, unless : your thread has blocking calls (waiting for something else, for example, : disk, i/o, etc), multiple threads working on the task set on a single cpu is : always slower than single thread working on the same task set because of the overhead of swapping in and out threads (register swap, L2 cache pollution, etc) : the maximum parallelism you can get is the number of CPUs in the system. : With one CPU, there is really no advantage
| k********e 发帖数: 702 | 14 看,我没说错吧?
除了你明白,其他人都以为一个物理CPU就没有并行能力。
把4核CPU不当回事。
【在 x**y 的大作中提到】 : 人家是四核。。。 : 最关键是windows没对多核cpu做优化 : 其实当成一个在用 : : unless : is : the
| k****u 发帖数: 43 | 15 随便看了下
首先用clock来计时就是不正确的
它计算是CPU cycle数量,一个process有一个,计算所有thread的
其次,像这种matrix形状的计算,还要考虑到cache的影响,google一下
tiling
并行程序很能写得有linear的scalability | z***e 发帖数: 5393 | 16 奇怪,不晓得你们都从哪里看到说windows没对多核做优化,凭空YY?有空多看看
windows internal之类的书去。以为还是win98年代啊?
回到lz的问题,如果你的任务分配得当,multi-threading在quad core上面肯定会快些
,你可以从这几个方面测试:
1. 把你那复杂的矩阵运算换成简单容易测试的,比如算10k个数相乘之类的,然后看多
线程和单线程的比较,这个主要是先让你把程序框架弄对,然后再把你自己的什么算法
换进去。
2. 把线程中的输出都关掉,还有StringCchprintf那个---不要在多现程的thread当中
搞.
3. 还不确信,用setaffinity把线程跟单个CPU绑定,如果quad core的每个CPU算1000
个数还不如一个cpu算4000个数来得快,你可以给intel或者ms file bug了。
【在 x**y 的大作中提到】 : 人家是四核。。。 : 最关键是windows没对多核cpu做优化 : 其实当成一个在用 : : unless : is : the
| x**y 发帖数: 10012 | 17 Windows和微软目前的编程语言对于1-4核处理器的电脑来说非常适用,毕竟现在的
最新Windows vista系统本身最多只能利用到两颗物理处理器的资源,只有特定软件优
化之后才能利用多核心的效能,而且设计的时候最高只考虑了四核心设计。
1000
【在 z***e 的大作中提到】 : 奇怪,不晓得你们都从哪里看到说windows没对多核做优化,凭空YY?有空多看看 : windows internal之类的书去。以为还是win98年代啊? : 回到lz的问题,如果你的任务分配得当,multi-threading在quad core上面肯定会快些 : ,你可以从这几个方面测试: : 1. 把你那复杂的矩阵运算换成简单容易测试的,比如算10k个数相乘之类的,然后看多 : 线程和单线程的比较,这个主要是先让你把程序框架弄对,然后再把你自己的什么算法 : 换进去。 : 2. 把线程中的输出都关掉,还有StringCchprintf那个---不要在多现程的thread当中 : 搞. : 3. 还不确信,用setaffinity把线程跟单个CPU绑定,如果quad core的每个CPU算1000
| z***e 发帖数: 5393 | 18 奇怪,什么叫最多只能利用到两个physical cpu的资源?虽然很俗,我还是想问一下这
个来源是哪里,我是从来没听说过。
而特定软件的“优化”又具体是指什么优化??唯一一个可以利用的api就是
SetAffinity,但这个并不比自动分配有任何好处。
实际应用中,一般线程数是CPU # x2,这个范围内可以看到明显的效果,再多就没啥差
别了。
【在 x**y 的大作中提到】 : Windows和微软目前的编程语言对于1-4核处理器的电脑来说非常适用,毕竟现在的 : 最新Windows vista系统本身最多只能利用到两颗物理处理器的资源,只有特定软件优 : 化之后才能利用多核心的效能,而且设计的时候最高只考虑了四核心设计。 : : 1000
| z*****n 发帖数: 7639 | 19 因为有多核?
【在 l********o 的大作中提到】 : 不太擅长多线程,没看代码瞎扯几句:如果你的线程体只是简单运算,那就要看看线程 : 管理的开销,如果是独立的任务,不要做同步的管理,否则线程会在主线程里面干等。 : 多线程你还是得试一试unix下的编程,另外如果不是做服务器为什么你要用多线程在单 : 机上做这个事情呢?
| O*******d 发帖数: 20343 | 20 multi thread scientific programming does not have much advantage on 单CPU | | | l******n 发帖数: 4 | 21 I did not read your code, but this article might give you some idea
http://msdn.microsoft.com/en-us/magazine/cc850829.aspx
【在 h**********c 的大作中提到】 : 问题是这样的. : 我的机器是vista 32,q 6600 单CPU : 大概有两亿个左右的任务,互相独立,其实都是简单的数学运算. : 我首先用最普通的c++ 写了个单线程程序,跑了大概994.77100秒. : 然后照着一个msdn上的例题,改为3个线程,跑了1729.13400秒; : 6个线程,1756.93700秒. : 问题: : 1.怎么解释这一现象,多线程反倒慢了? : 2.程序贴在楼下,请高人帮分析分析,如何优化,还是vista对这种问题已经优化,多线程 : 是没有必要的?
| w*********l 发帖数: 1337 | 22 如果你是单cpu,而且你的workload是cpu-bound(就是基本没有i/o),那多线程一定会
慢。慢多少就要看系统管理线程的开销有多少了。
p.s. 你这个code贴得太烂,格式都没了,没人有心思看。
【在 h**********c 的大作中提到】 : 问题是这样的. : 我的机器是vista 32,q 6600 单CPU : 大概有两亿个左右的任务,互相独立,其实都是简单的数学运算. : 我首先用最普通的c++ 写了个单线程程序,跑了大概994.77100秒. : 然后照着一个msdn上的例题,改为3个线程,跑了1729.13400秒; : 6个线程,1756.93700秒. : 问题: : 1.怎么解释这一现象,多线程反倒慢了? : 2.程序贴在楼下,请高人帮分析分析,如何优化,还是vista对这种问题已经优化,多线程 : 是没有必要的?
| b***i 发帖数: 3043 | 23 同意楼上说的,写得太乱。
你应该抽象一下,贴你的改过的主程序,就是包含生成和结束线程的一个函数就可以了
。你说你生成了几亿个,就是那个。
【在 h**********c 的大作中提到】 : 问题是这样的. : 我的机器是vista 32,q 6600 单CPU : 大概有两亿个左右的任务,互相独立,其实都是简单的数学运算. : 我首先用最普通的c++ 写了个单线程程序,跑了大概994.77100秒. : 然后照着一个msdn上的例题,改为3个线程,跑了1729.13400秒; : 6个线程,1756.93700秒. : 问题: : 1.怎么解释这一现象,多线程反倒慢了? : 2.程序贴在楼下,请高人帮分析分析,如何优化,还是vista对这种问题已经优化,多线程 : 是没有必要的?
| z***e 发帖数: 5393 | 24 他只有6个thread,每个thread好像是在算一个matrix之类的东西。
建议他还是学点基本的调试技巧,好歹先验证自己的code结构是正确的,不要光copy&
paste就完了。
【在 b***i 的大作中提到】 : 同意楼上说的,写得太乱。 : 你应该抽象一下,贴你的改过的主程序,就是包含生成和结束线程的一个函数就可以了 : 。你说你生成了几亿个,就是那个。
| x****u 发帖数: 44466 | 25 有几个核就开N的倍数的线程,你的科学计算保持线程数等于核的数量就行。
不过在假多核上,可能出现多线程慢于单线程的问题,这个不是你的错。
【在 h**********c 的大作中提到】 : 问题是这样的. : 我的机器是vista 32,q 6600 单CPU : 大概有两亿个左右的任务,互相独立,其实都是简单的数学运算. : 我首先用最普通的c++ 写了个单线程程序,跑了大概994.77100秒. : 然后照着一个msdn上的例题,改为3个线程,跑了1729.13400秒; : 6个线程,1756.93700秒. : 问题: : 1.怎么解释这一现象,多线程反倒慢了? : 2.程序贴在楼下,请高人帮分析分析,如何优化,还是vista对这种问题已经优化,多线程 : 是没有必要的?
| b***i 发帖数: 3043 | | n****9 发帖数: 45 | | h**********c 发帖数: 4120 | 28 my g-card is ATI, I don't know if it supports CUDA.
【在 n****9 的大作中提到】 : 试试用CUDA编吧
| h**********c 发帖数: 4120 | 29 贴的code,行首的空格和tab都被吃了回扣了,
不过visual studio下把code, CTRL-K,CTRL-F很容易就从新FORMAT
根据liuhulan 同志介绍的MSDN上, KEN KERR的文章,
对单线程做了一些改动,主要还是基于LOCALITY的思想:
1. 不在SUBROUTINE 中使用NEW, DELETE,能不用DYNAMIC MEMALLOC尽量不用,坚决不要
在循环体中使用.
基于这一点,原来单线程900秒,提高到300秒!!
2. 所有SUBROUTINE 改成INLINE,300->287秒.
3. 在循环体内不进行console print,影响不大.
因为我把程序改成把要输出的结果存到一个array,并且要一个counter,因此会有race
condition,需要cs or mutex. multithreading 测试待续. | h**********c 发帖数: 4120 | 30 在单线程程序的for 前面加了一句,
#pragma omp parallel for
performance 略有提高,285.905950秒,
1. 无法证实performance提高了,还是今天晚上运行的程序少了,monitor上显示,一个核
负载比较大,其他的核少,比较均匀.
2. 没有实现cs or mutex,#pragma omp parallel for估计不能处理race condition(有
待查证). | | | n****9 发帖数: 45 | 31 Why not change your g-card to NVIDIA
【在 h**********c 的大作中提到】 : my g-card is ATI, I don't know if it supports CUDA.
| h**********c 发帖数: 4120 | 32 Cost control.
【在 n****9 的大作中提到】 : Why not change your g-card to NVIDIA
| h**********c 发帖数: 4120 | 33 As we experiment previously a same machine (dell xps 420, QUAD 6600, 8gb .
same c program, single thread programming.
Vista 32 : 287 Seconds
Fedora 64: 247 Secondss
It seems Fedora 64 faster than vista 32. | p**l 发帖数: 616 | 34 试试ms现在的 parallel extension 和 intel得 parallel studio 吧 | h**********c 发帖数: 4120 | 35 Total time elapsed: 1730.176792
The sparcv9 processor operates at 900 MHz,
A solaris 4 cpu server,
single thread 1730.176792 seconds,
I have been long not written threading program.
Try later. | h**********c 发帖数: 4120 | 36 I did try
#pragma omp parallel for
Is this what you propose?
I never wrote .net program. my world is simple c++ or linux c++.
【在 p**l 的大作中提到】 : 试试ms现在的 parallel extension 和 intel得 parallel studio 吧
| P********e 发帖数: 2610 | 37 应该是有优化,不过和LINUX有点区别就是
WIN是 1个KERNEL thread对multi user thread, right? 还是有改进?
linux是multi-kernel thread <-> multi user thread, right?
1000
【在 z***e 的大作中提到】 : 奇怪,不晓得你们都从哪里看到说windows没对多核做优化,凭空YY?有空多看看 : windows internal之类的书去。以为还是win98年代啊? : 回到lz的问题,如果你的任务分配得当,multi-threading在quad core上面肯定会快些 : ,你可以从这几个方面测试: : 1. 把你那复杂的矩阵运算换成简单容易测试的,比如算10k个数相乘之类的,然后看多 : 线程和单线程的比较,这个主要是先让你把程序框架弄对,然后再把你自己的什么算法 : 换进去。 : 2. 把线程中的输出都关掉,还有StringCchprintf那个---不要在多现程的thread当中 : 搞. : 3. 还不确信,用setaffinity把线程跟单个CPU绑定,如果quad core的每个CPU算1000
| P********e 发帖数: 2610 | 38 刚才看前边人发的Kenny Kerr的windows with c++
我相信做图象的人都用过他的这种方法,不过也没想到这种也可以上MSDN
INTEL再牛B也就4CORE,去看看nvidia多少个core,你就知道GPGPU了
估计就不是1700多秒,是几百秒了
【在 h**********c 的大作中提到】 : I did try : #pragma omp parallel for : Is this what you propose? : I never wrote .net program. my world is simple c++ or linux c++.
| h**********c 发帖数: 4120 | 39 msdn 主要是科普的吧,
如果没学过系统,架构(我记得主要是架构里讲hit rate), Kerr的文章还是不那么容易
吃透的.
GPGPU主要的问题太依赖硬件,
搞应用开发,象我要写程序,必须在LINUX和WINDOWS下都能跑,
有时候还要求在UNIX,APPLE上也能跑,
有一些搞数学的老头子,可能连笔记本都没用过.
【在 P********e 的大作中提到】 : 刚才看前边人发的Kenny Kerr的windows with c++ : 我相信做图象的人都用过他的这种方法,不过也没想到这种也可以上MSDN : INTEL再牛B也就4CORE,去看看nvidia多少个core,你就知道GPGPU了 : 估计就不是1700多秒,是几百秒了
| c******a 发帖数: 600 | 40 不懂为什么这是不用CUDA的理由
【在 h**********c 的大作中提到】 : msdn 主要是科普的吧, : 如果没学过系统,架构(我记得主要是架构里讲hit rate), Kerr的文章还是不那么容易 : 吃透的. : GPGPU主要的问题太依赖硬件, : 搞应用开发,象我要写程序,必须在LINUX和WINDOWS下都能跑, : 有时候还要求在UNIX,APPLE上也能跑, : 有一些搞数学的老头子,可能连笔记本都没用过.
| | | M*****a 发帖数: 2054 | 41 cuda对于存在数据依赖的情况下的并行化并不好
【在 c******a 的大作中提到】 : 不懂为什么这是不用CUDA的理由
| h**********c 发帖数: 4120 | 42 如果一个程序非常依赖于一种特别的硬件,
对于非计算机专业用户来讲,是非常头痛的吧.
【在 c******a 的大作中提到】 : 不懂为什么这是不用CUDA的理由
| s*****g 发帖数: 5159 | 43 所有的程序都依赖CPU,CPU两家厂商,AMD/Intel,两者一般都行。
CUDA程序依赖GPU,GPU两家厂商,nVidia/ATI,nVidia最近二年的显卡都行。
CUDA是个通用接口,支持CUDA的GPU占到市场大半,所以没啥问题,不是那么硬件
specific。
【在 h**********c 的大作中提到】 : 如果一个程序非常依赖于一种特别的硬件, : 对于非计算机专业用户来讲,是非常头痛的吧.
| M*****a 发帖数: 2054 | 44 vvs大牛今年搞不搞google code jam?
30 | M*****a 发帖数: 2054 | | h**********c 发帖数: 4120 | 46 这个程序的目的是解一个叫'六角幻方'数字游戏(可以google,有详细介绍),在mitbbs最
早是在数学的leonanny提出征求解题思路,仁者见仁...
如果把m和n改了,就没有什么意义了,
这个程序可以在没有字典的情况下,进行brutal attack(don't do that illegally).我
个人命名其为,index permutation,如果已经有人提出,恕鄙人寡闻了.
我之前对这个程序做过改动,
就是把你改的局部变量全设为全局变量,不再在循环中使用 new, delete.
我稍后把改动过的程序贴上来,在我的q6600,m=7,n=19,上跑300秒.
30 | h**********c 发帖数: 4120 | 47 我正在写linux下的多线程,
可以把你的code 贴上来吗?
行家一伸手,便知有没有. | h**********c 发帖数: 4120 | 48 It is fantastic!
I copy your code and compile.
2 threads: 85.2 seconds
4 threads: 44.9 seconds
8 threads: 43.5 seconds
my OS is vista 32 + visual c++ 2008 express.
2
10- | h**********c 发帖数: 4120 | 49 重新在release 下跑了一下,
// 4 threads
//Total time elapsed: 11.27700
// 8 threads
//Total time elapsed: 10.67000
//16 threads
//Total time elapsed: 10.79100
偶以前所有的程序几乎都是在debug下跑的,我还在读你的code,看如果在linux下写,有
什么能借鉴的地方.
Thanks!
slower than Release. | h**********c 发帖数: 4120 | 50 这个六角幻方给人的第一直觉-- 象有限元的网格,
而且的确有限,19!很大,但毕竟有限,但是最后下决心做试一下,还是serawang的几个贴
子(在数学版)比较有启迪的意义.
这个题可以列十五个线性方程,19个未知数,按线性代数的知识,有无穷多解,但是是有代
数表达的.考虑未知数不同,且为1~19.当时没有google,还不知道能不能找到答案,只想
试一下线性代数的知识.
后来用matlab分析发现,十五个线性方程,有十二个是非线性相关,遗憾的是,按matlab例
题,无法给出正确的代数表达式,而且计算的reduced echlon matrix也是错误的.最后花
了两个小时,手工算出来十二个线性方程,那么,知道七个未知数,其他十二个未知数可
得.
matlab是一种科普工具,最后写code还得c/c++.先写了单线程,1700秒居然得出答案!后来照
msdn的多线程又写了一个多线程版本,没有提高,反而更慢.大概是liuhulan转了ken kerr 关于locality的文章,茅
涩顿开.
中间又去干了别的事情,没来得及对windows多线程更多优化,跑到300秒.
在我自己机器上, |
|