MS测定程序运行占用内存时CPU占用率很低,怎么设置多核并行

查看: 16627|回复: 36
如何设置多核CPU运行NX nastran提高解算效率?
我的电脑是AMD 4核CPU,win7 64位系统,NX8.0.
修改环境变量UGII_SMP_ENABLE=1,解算时CPU还是只用25%。求大师解解这个问题.
打赏列表共打赏了0次
还木有人打赏~
本帖最后由 caozhengwen 于
12:43 编辑 : }! A$ p2 D4 H) z# N" ~; v2 Q6 t
jiangsz2009 发表于
09:25 ! H0 I&&D- I&&c! B' c& O9 p% @
命令行就是windows 附件中命令行模式。nastran.exe文件在UG安装目录下的NXNASTRAN文件夹下,因此你可以在命 ...
谢谢指点。6 j. L+ b8 d. @8 H4 |. F2 c
我已经解决这个问题了。在解算里面,有个选项是可以调的,直接打开105~150栏,把并行数设置为机器的参数就可以了。不用大侠说的这么复杂。&&a5 G8 E4 j. s, _5 L( W
对于流解算器,UG8有个选项可以直接勾上,打开就可以了。低于UG8的版本没有看到这个选项。
急求解答,,,
楼主所说的那个环境变量只是针对UG的一些parasolid 建模功能起作用,这个变量是不能影响到Nastran求解器的。而如果需要利用多核CPU进行计算,可以采用命令行的方式,运行命令 nastran example parallel=n&&其中n是线程数,可以是1-1023的数字
jiangsz2009 发表于
楼主所说的那个环境变量只是针对UG的一些parasolid 建模功能起作用,这个变量是不能影响到Nastran求解器的。 ...
有没有简单的,直接在环境变量里可以设置的?
另外大侠所说的,在命令行的方式输入,这个要怎么操作?恳求指点,感激不尽。。。。。。
命令行就是windows 附件中命令行模式。nastran.exe文件在UG安装目录下的NXNASTRAN文件夹下,因此你可以在命令行中使用CD UG安装目录/NXNASTRAN&&进入该文件路径下, 就可以运行前边所说的命令行了。但是如果example.dat文件不在同一目录下,你需要在example之前增加文件路径。
请问楼主所用UG8.0是正试版的吗?能否做CAE分析?如能,请给我发一份原程序,您的同行先谢谢了。邮箱地址:或上传QQ:
sxp123 发表于
19:42 1 p0 C& L* v, i7 k3 X. t1 Q. b
请问楼主所用UG8.0是正试版的吗?能否做CAE分析?如能,请给我发一份原程序,您的同行先谢谢了。邮箱地址: ...8 y% E' l- L9 _0 @, c. M
对你的提问感到无语了。我看过你发的帖子。。。。你是生意人,不是搞技术的。
caozhengwen 发表于
12:43 # n* P8 d# j* d5 D" m/ x/ }
谢谢指点。" N' b( O/ R; Z, r# S, q, V" _$ Y
我已经解决这个问题了。在解算里面,有个选项是可以调的,直接打开105~150栏,把并行数设置 ...! K! }: R1 }+ w% T- Y' h+ U) i! B+ o
我怎么没找到并行数设置的啊 流体的我找到了
生意人怎么会精通ug nx cae呢。不给也就算了。你看到我的帖子不错,那是我负出了很大的精力才掌握的,换着你呢?* g% ~4 {& n9 \' ~# g+ U/ D
周二至周日:09:00 - 17:00
公司地址:广东省东莞市长安镇上沙社区荣富路37号
UG官网创建于2005年,致力于为中国UG爱好者提供ug8.0|6.0|4.0下载及安装方法、UG培训、UG教程等UG模具技术行业交流论坛
Powered by本博客rss订阅地址: http://feed.cnblogs.com/blog/u/147990/rss
下面的程序针对多核处理器,可以设置让任何一个cpu显示相应的曲线(本文以正弦曲线为例)
代码编译环境:windows 7 64位 酷睿 i5 处理器,vs2010.
可以修改CpuSin函数的计算 busySpan 和 idleSpan的部分以显示不同的曲线。
下面的代码没有考虑cpu中其他进程的占用情况,这种情况详见第二部分
1 #include &windows.h&
2 #include &stdio.h&
3 #include &math.h&
5 //把一条正弦曲线0~2pi 之间的弧度等分200份抽样,计算每个点的振幅
6 //然后每隔300ms设置下一个抽样点,并让cpu工作对应振幅时间
7 const int samplingCount = 200; //抽样点数目
8 const double pi = 3.1415926;
9 const int totalAmplitude = 300; //每个抽样点对应时间片
10 const double delta = 2.0/samplingC
//抽样弧度的增量
12 int busySpan[samplingCount];//每个抽样点对应的busy时间
13 int idleSpan[samplingCount];//每个抽样点对应的idle时间
15 //一个线程调用MakeUsageSin,并把该线程绑定到一个cpu,那么该cpu呈现正弦曲线
16 DWORD WINAPI MakeUsageSin(LPVOID lpParameter)
DWORD startTime = 0;
for(int j = 0; ; j = (j + 1) % samplingCount)
startTime = GetTickCount();
while ((GetTickCount() - startTime) & busySpan[j]);
Sleep(idleSpan[j]);
27 //如果cpuindex & 0 则所有cpu都显示正弦曲线
28 //否则只有第 cpuindex个cpu显示正弦曲线
29 //cpuindex 从 0 开始计数
30 void CpuSin(int cpuIndex)
//计算 busySpan 和 idleSpan
double radian = 0;
int amplitude = totalAmplitude / 2;
for (int i = 0; i & samplingC i++)
busySpan[i] = (DWORD)(amplitude + sin(pi*radian)*amplitude);
idleSpan[i] = totalAmplitude - busySpan[i];
//获取系统cup数量
SYSTEM_INFO SysI
GetSystemInfo(&SysInfo);
int num_processors = SysInfo.dwNumberOfP
if(cpuIndex + 1 & num_processors)
printf("error: the index of cpu is out of boundary\n");
printf("cpu number: %d\n", num_processors);
printf("your index: %d\n", cpuIndex);
printf("** tip: the index of cpu start from 0 **\n");
if(cpuIndex & 0)
HANDLE* threads = new HANDLE[num_processors];
for (int i = 0;i & num_i++)
DWORD mask = 1&&i;
threads[i] = CreateThread(NULL, 0, MakeUsageSin, &mask, 0, NULL);
SetThreadAffinityMask(threads[i], 1&&i);//线程指定在某个cpu运行
WaitForMultipleObjects(num_processors, threads, TRUE, INFINITE);
DWORD mask = 1;
thread = CreateThread(NULL, 0, MakeUsageSin, &mask, 0, NULL);
SetThreadAffinityMask(thread, 1&&cpuIndex);
WaitForSingleObject(thread,INFINITE);
76 int main()
CpuSin(0);
运行结果:
下面我们考虑其他进程对cpu的影响,即需要检测出某个cpu当前的使用率。
首先对于单核处理器获取cpu利用率,或者多核处理器获取总的cpu利用率,可以通过windows api &GetSystemTimes& 来实现
该函数声明如下:BOOL GetSystemTimes(LPFILETIME& IdleTime,LPFILETIME&& KernelTime,LPFILETIME&& UserTime),具体可以参考
cpu利用率计算公式为:CPURate=100.0-(NowIdleTime-LastIdleTime)/(NowKernelTime-LastKernelTime+NowUserTime-LastUserTime)*100.0
计算总的cpu利用率或者单核处理器cpu利用率的类实现如下:
1 class CCPUUseRate
BOOL Initialize()
FILETIME ftIdle, ftKernel, ftU
BOOL flag = FALSE;
if (flag = GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
m_fOldCPUIdleTime = FileTimeToDouble(ftIdle);
m_fOldCPUKernelTime = FileTimeToDouble(ftKernel);
m_fOldCPUUserTime = FileTimeToDouble(ftUser);
//调用Initialize后要等待1左右秒再调用此函数
int GetCPUUseRate()
int nCPUUseRate = -1;
FILETIME ftIdle, ftKernel, ftU
if (GetSystemTimes(&ftIdle, &ftKernel, &ftUser))
double fCPUIdleTime = FileTimeToDouble(ftIdle);
double fCPUKernelTime = FileTimeToDouble(ftKernel);
double fCPUUserTime = FileTimeToDouble(ftUser);
nCPUUseRate= (int)(100.0 - (fCPUIdleTime - m_fOldCPUIdleTime)
/ (fCPUKernelTime - m_fOldCPUKernelTime + fCPUUserTime - m_fOldCPUUserTime)
m_fOldCPUIdleTime = fCPUIdleT
m_fOldCPUKernelTime = fCPUKernelT
m_fOldCPUUserTime = fCPUUserT
return nCPUUseR
36 private:
double FileTimeToDouble(FILETIME &filetime)
return (double)(filetime.dwHighDateTime * 4.) + (double)filetime.dwLowDateT
41 private:
double m_fOldCPUIdleT
double m_fOldCPUKernelT
double m_fOldCPUUserT
注意:前后两次调用GetSystemTimes之间要间隔一定时间,使用方法如下:
1 int main()
CCPUUseRate cpuUseR
if (!cpuUseRate.Initialize())
printf("Error! %d\n", GetLastError());
return -1;
while (true)
Sleep(1000);
printf("\r当前CPU使用率为:%4d%%", cpuUseRate.GetCPUUseRate());
对于计算多核处理器中单个cpu的使用率,可以使用pdh.h头文件中的接口,该头文件是visual studio自带的,包含该头文件时,还需要引入相关的lib库:
1 #include &TCHAR.h&
2 #include &windows.h&
3 #include &pdh.h&
4 #include &cstdio&
5 #include &cmath&
6 #pragma comment(lib, "pdh.lib")
8 //---------------------------------------------------comput the cpu usage rate
9 static PDH_HQUERY cpuQ
10 static PDH_HCOUNTER cpuT
12 //cpuindex 为指定的cpu id ,从0开始
13 void init(int cpuIndex)
PDH_STATUS Status = PdhOpenQuery(NULL, NULL, &cpuQuery);
if (Status != ERROR_SUCCESS)
printf("\nPdhOpenQuery failed with status 0x%x.", Status);
char buf[50];
sprintf(buf, "\\Processor(%d)\\%% Processor Time", cpuIndex);
PdhAddCounter(cpuQuery, LPCSTR(buf), NULL, &cpuTotal);
PdhCollectQueryData(cpuQuery);
28 double getCpuUsageRate()
PDH_FMT_COUNTERVALUE counterV
PdhCollectQueryData(cpuQuery);
PdhGetFormattedCounterValue(cpuTotal, PDH_FMT_DOUBLE, NULL, &counterVal);
return counterVal.doubleV
注:该方法也可以计算总的cpu利用率,只要把PdhAddCounter的第二个字符串参数改为"\\Processor(_Total)\\%% Processor Time"
& & & 前后两次调用PdhCollectQueryData之间也需要间隔一定时间
使用方法如下:
1 int main()
Sleep(800);
printf("\n%f\n", getCpuUsageRate());
利用上述方法获取cpu当前利用率后,再画正弦曲线,只需要改变进程的busy时间和idle时间,如果当前点曲线需要的cpu利用率是a%,cpu实际利用率是b%
若a&b, 那么进程的busy时间为该点时间片的(a-b)%
若a&=b,那么进程busy时间为0(实际情况中由于cpu使用率采集的不精确以及使用率的不断变化,busy时间设置为0效果不一定最好,本文中是设置为原来时间的3/4)
实际上除了当前进程外,如果cpu一直占用某个使用率,会影响曲线的形状,特别是曲线的下部分.
代码如下:
1 #include &TCHAR.h&
2 #include &windows.h&
3 #include &pdh.h&
4 #include &cstdio&
5 #include &cmath&
6 #pragma comment(lib, "pdh.lib")
8 //---------------------------------------------------comput the cpu usage rate
9 static PDH_HQUERY cpuQ
10 static PDH_HCOUNTER cpuT
12 //cpuindex 为指定的cpu id ,从0开始
13 void init(int cpuIndex)
PDH_STATUS Status = PdhOpenQuery(NULL, NULL, &cpuQuery);
if (Status != ERROR_SUCCESS)
printf("\nPdhOpenQuery failed with status 0x%x.", Status);
char buf[50];
sprintf(buf, "\\Processor(%d)\\%% Processor Time",cpuIndex);
PdhAddCounter(cpuQuery, LPCSTR(buf), NULL, &cpuTotal);
PdhCollectQueryData(cpuQuery);
28 double getCpuUsageRate()
PDH_FMT_COUNTERVALUE counterV
PdhCollectQueryData(cpuQuery);
PdhGetFormattedCounterValue(cpuTotal, PDH_FMT_DOUBLE, NULL, &counterVal);
return counterVal.doubleV
36 //--------------------------------------------------------------------cpu sin
37 //把一条正弦曲线0~2pi 之间的弧度等分200份抽样,计算每个点的振幅
38 //然后每隔300ms设置下一个抽样点,并让cpu工作对应振幅时间
39 const int samplingCount = 200; //抽样点数目
40 const double pi = 3.1415926;
41 const int totalAmplitude = 300; //每个抽样点对应时间片
42 const double delta = 2.0/samplingC
//抽样弧度的增量
44 DWORD busySpan[samplingCount];//每个抽样点对应的busy时间
45 int idleSpan[samplingCount];//每个抽样点对应的idle时间
47 //一个线程调用MakeUsageSin,并把该线程绑定到一个cpu,那么该cpu呈现正弦曲线
48 DWORD WINAPI MakeUsageSin(LPVOID lpParameter)
DWORD startTime = 0;
for(int j = 0; ; j = (j + 1) % samplingCount)
startTime = GetTickCount();
DWORD realBusy = busySpan[j];
double currentCpuUsageRate = getCpuUsageRate();
if(currentCpuUsageRate & busySpan[j]*1.0/totalAmplitude)
realBusy = (busySpan[j]*1.0/totalAmplitude - currentCpuUsageRate)*totalA
realBusy *= 0.75;
while ((GetTickCount() - startTime) & realBusy);
Sleep(idleSpan[j]);
67 //如果cpuindex & 0 则所有cpu都显示正弦曲线
68 //否则只有第 cpuindex个cpu显示正弦曲线
69 //cpuindex 从 0 开始计数
70 void CpuSin(int cpuIndex)
//计算 busySpan 和 idleSpan
double radian = 0;
int amplitude = totalAmplitude / 2;
for (int i = 0; i & samplingC i++)
busySpan[i] = (DWORD)(amplitude + sin(pi*radian)*amplitude);
idleSpan[i] = totalAmplitude - busySpan[i];
//获取系统cup数量
SYSTEM_INFO SysI
GetSystemInfo(&SysInfo);
int num_processors = SysInfo.dwNumberOfP
if(cpuIndex + 1 & num_processors)
printf("error: the index of cpu is out of boundary\n");
printf("cpu number: %d\n", num_processors);
printf("your index: %d\n", cpuIndex);
printf("** tip: the index of cpu start from 0 **\n");
if(cpuIndex & 0)
HANDLE* threads = new HANDLE[num_processors];
for (int i = 0;i & num_i++)
DWORD mask = 1&&i;
threads[i] = CreateThread(NULL, 0, MakeUsageSin, &mask, 0, NULL);
SetThreadAffinityMask(threads[i], 1&&i);//线程指定在某个cpu运行
WaitForMultipleObjects(num_processors, threads, TRUE, INFINITE);
init(cpuIndex);
DWORD mask = 1;
thread = CreateThread(NULL, 0, MakeUsageSin, &mask, 0, NULL);
SetThreadAffinityMask(thread, 1&&cpuIndex);
WaitForSingleObject(thread,INFINITE);
117 //-------------------------------------
119 int main()
CpuSin(0);
主要改动在MakeUsageSin函数,初始化在上面代码108行
结果如下:
【版权声明】转载请注明出处&
阅读(...) 评论()
本博客rss订阅地址: http://feed.cnblogs.com/blog/u/147990/rss璁╁?鏍窩PU鍗犵敤鐜囨洸绾垮惉浣犳寚鎸モ}

我要回帖

更多关于 剑灵运行占用多大内存 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信