值得思考的问题~~

tczyp 2007-04-07 04:29:57
听说微软有一个新技术:WCCS(微软高性能运算平台),CCS是微软公司第一款用于运行并行高性能计算(HPC)应用程序的软件。不知道这个工具是否能给我们开发并行程序带来一些方便。
另外,我想问问,传统的基于。net架构开发的多线程方式实现并行程序的方法中的创建多线程,创建线程池,还有异步调用等方式是否互相等价的?还是它们之中有一定的差别。我举一个例子,比如一个程序,可以支持100路并行执行,但是现在我的CPU只有4个核,那就是说最多能支持4路并行操作。当然,按照并行的折叠原理,我们也可以使用这四个核来执行上面的程序,但是如果我们在编程的时候开了100个线程来执行这个程序的话,实际上是很浪费的,因为事实上只需要用4个线程就能发挥该机器的最大效能。这样就浪费了大量的创建线程所用的时间开销。有没有一个灵活的方法让底层根据现有的硬件资源(比如8个核就打开8个线程)来调整打开的线程数目呢?
...全文
580 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
tczyp 2007-04-16
  • 打赏
  • 举报
回复
我倒是只希望能够并行读写不同地址的内存,现在想起来,forturn是可以很简单的做到,可以并行创建一系列对象并给其赋初值!
flyingdog 2007-04-14
  • 打赏
  • 举报
回复
关于内存分配,可能现在的底层的内存分配机制还不支持并行。不过没有具体实验过。

即时对于同一个地址的内存也可以并行读取,硬件会解决冲突,但是软件方面,需要自己做好同步。其实即时说是内存的并行读取,也受到内存带宽的影响。所以对于内存带宽需求量比较大的计算,需要考虑利用好cache
fangzhe 2007-04-12
  • 打赏
  • 举报
回复
你只有抛弃C#和.net Framework……那个东西CPU越多效率越差……
tczyp 2007-04-12
  • 打赏
  • 举报
回复
我用的是C#,另外,什么机器上面,访问内存才可以并发的执行?而且我非常深刻的感受到,要真正的实现并行计算,内存读写可并行是很关键的,因为没什么计算任务是单纯的 计算而不涉及把计算结果存储起来
赖勇浩 2007-04-12
  • 打赏
  • 举报
回复
如果你对不同内存进行读写,是可以并行的。
tczyp 2007-04-10
  • 打赏
  • 举报
回复
对了,还想问问,分配内存的时候是否可以并行处理?假设我现在处于多核的平台上,比如有4核,我用循环给一个类创建多个对象(为了有一个数量上的概念,假设要创建100000个对象,占据200M的内存空间),与及我对每次创建(或者是每n次创建对象)开一个独立的线程,让多个线程来完成批量创建对象的工作,这样的话,多核相对与单核对性能有没有显著的提高?我自己的分析是:创建对象的时候首先要在内存上面找到可用的空间,这需要CPU来计算,所以对于多核的架构,并行是有性能上的提高的,但是同时我觉得内存分配的过程是一个IO密集型的过程,需要大量读写内存,而内存是否可以并行的读写?或者说内存的读写速度不是性能的瓶颈?(原因:CPU处理得比内存读写要慢很多?),又或者读写过程在cache上完成,所以很快?(但是这个似乎不太可能,因为创建内存是面向大块内存的,而不是重复在一块内存上读写,这应该会导致cache频繁的不命中)还有就是好像现在的体系结构可以利用MDA来辅助读写内存的,这又从某种程度上解放了CPU,而使到读写内存的瓶颈不在CPU?

希望有多核设备的朋友就此进行一些实验,看看多核会不会为分配大量内存带来性能上的大幅提高,如果有,又能提高多少倍?能否接近核的数目?
fangzhe 2007-04-10
  • 打赏
  • 举报
回复
从操作系统层面讲,分配内存可以,每个CPU有虚拟空间的;但是malloc的实现不是针对并行设计的,建议用hoard memory allocator
具体测试见http://www.cs.umass.edu/~emery/heaplayers.html
但是在Intel这种民用级别的多核系统,内存访问确实是瓶颈,因为总线带宽的问题
那个DMA(不是MDA)是为了设备之间通信不经过CPU设计的
tczyp 2007-04-09
  • 打赏
  • 举报
回复
内存的读取,算不算io?对了,对于内存的读取能不能同一时间读取多个位?
赖勇浩 2007-04-09
  • 打赏
  • 举报
回复
.net本身就有很多性能计数器可以反映出程序的性能。
tczyp 2007-04-09
  • 打赏
  • 举报
回复
但是对于。net有什么比较好的性能测试方式吗?
赖勇浩 2007-04-09
  • 打赏
  • 举报
回复
开多少条线程要看具体的应用,如果你的程序是计算密集型的,而且有很多计算可以并行执行(如使用OpenMP编写的科学计算程序)一般线程数量是CPU个数+1或者+2
而程序是I/O密集型,如网络服务器、数据库服务器、文件服务器等,通常可以同时开更多的线程

为了发挥计算机最大的效能,我们需要使用性能测试的方式来评估线程数量。
fangzhe 2007-04-08
  • 打赏
  • 举报
回复
有啊,上来先调查一下有多少CPU(好像kernel有这个函数),再开线程
aero_boy 2007-04-08
  • 打赏
  • 举报
回复
具体开多少个线程好,这不单单是开有多少个cpu来定的,更重要的是看你的应用是什么样的了,如果有很多的IO操作,你在4核上只开4个线程的话,cpu很多时候就是闲着的。
tczyp 2007-04-08
  • 打赏
  • 举报
回复
另外,最近用.net的线程池,遇到一个很奇怪的问题:
我用线程池打开了很多线程,但有时候有一个线程(每次出现问题的时候都是一个而不是多个)没能够执行完。虽然这些线程是访问了同一个内存区域的,但是只有一个线程没执行完的话,不会是因为死锁引起的(如果死锁起码有两个线程不能执行完吧)大家推测一下是什么原因呢?另外,有没有办法可以找出线程池里面没有执行完的线程。还有就是VS2005中对于线程的调试有没有比较直观的办法,比如知道哪个线程执行到那里。


顺便附上源码:

private int completeThreadNum;

public void Preprocessing(IPositionSet positionSet)
{
completeThreadNum = 0;

positionSet.InitToTraverseSet();
while (positionSet.NextPosition())
{
ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), positionSet.GetPosition());
//Insert(positionSet.GetPosition());
}

while (completeThreadNum < positionSet.GetNum())
{
Thread.CurrentThread.Join(1);
}
}

private void ThreadProc(object point)
{
Insert((IPosition)point);
completeThreadNum++;
}

public void Insert(IPosition point)
{
IPosition NewPosition = point;

for (int levelSequrence = LevelList.Count - 2; levelSequrence >= -1; levelSequrence--)
{
Part currentPart = LevelList[levelSequrence + 1].GOCPartRefByPoint(point);

currentPart.AddToSubPositionList(NewPosition);

if (currentPart.GetSubPositionNum() == 1)
{
//如果part里面只有一个point,说明这个part也是新建的,它所属的宏观分块也必须把它包含.
NewPosition = currentPart;
}
else
{
break;
}
}

//更新不同层里面该点所在的part中点的数目
for (int levelSequrence = LevelList.Count - 2; levelSequrence >= -1; levelSequrence--)
{
((Part)LevelList[levelSequrence + 1].GetPartRefByPoint(point)).SubPointNumIncrease(1);
}
}


我是借助completeThreadNum 来知道还有多少个线程没有执行完的
flyingdog 2007-04-08
  • 打赏
  • 举报
回复
OpenMP是可以根据CPU的情况开不同数量的线程的。
但是多线程的程序除了利用多核CPU进行计算外,还有提高响应的功能,在那些方面即时开100个线程也未必是浪费。

568

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧