2011年5月

Windows 7中系统服务进程无法使用cuda进行GPU并行计算的解决方案

最近测试提了一个Bug,原来一直正常的服务进程在新的系统中无法正常工作,现象就是显卡GPU没有正常工作。

这两天跟踪了一下问题,找到了原因,这里把具体的解决办法贴出来,方便有同样问题的朋友快速解决问题^_^。

原因分析:
Vista之后,操作系统引入了Session 0 Isolation的机制,将系统服务全部隔离到会话0中执行,但是会话0中的系统服务无法使用显卡设备,导致cuda在加载显卡驱动时失败,而无法启动GPU进行并行计算。

具体的会话0隔离机制可以参考MSDN文章:
http://msdn.microsoft.com/en-us/library/bb756986.aspx

解决方案:
找到了原因一切就好办了,从分析来看,主要是会话0中无法加载显卡驱动,所以这里需要将使用显卡的进程越狱到用户会话中,比如会话1等。

这个办法在CUDA的论坛中已经有过讨论了,这里有兄台给出了一些示例代码,可以参考:
http://forums.nvidia.com/index.php?showtopic=93450

这里说说我的具体解决方案:

  1. 在服务进程中,循环枚举可用用户会话ID
  2. 获取有效用户会话之后,获取对应用户的会话令牌
  3. 以该用户会话启动新的进程

涉及到的API如下:
通过WTSEnumerateSessions 获取所有有效会话,通过判断WTS_SESSION_INFO的State字段,获取活动会话ID
记得使用完之后,通过WTSFreeMemory释放相关内存
通过WTSQueryUserToken获取会话ID对应的会话Token
最后调用CreateProcessAsUser将进程启动到用户会话中,就可以了

总结:
其实上面的方法,相当于是延时启动,当有用户登陆之后,才启动真正的工作进程。
上述方案,需要对工程进行进程分离,将实际工作的进程独立起来,以启动到用户会话中。
有一个小问题,目前没有找到相关解决方案,有待进一步学习,有知道的朋友请分享一下^_^:
当开启UAC功能时,通过CreateProcessAsUser启动的进程无法获取管理员权限,如果工作进程需要管理员权限,可能需要关闭UAC功能才行。

Fedora 13下源码编译Mono和MonoDevelop流程总结

Fedora提供的RPM版的Mono版本比较低,为了学习体验最新版,就自己编译了一遍,整体流程比较简单,这里做个笔记记录一下。其他的一些插件就根据需要自行安装吧,走完这个流程,其他的就是小意思啦。

以下安装的版本为目前最新版(2011.5.21) Mono 2.10.2 和 MonoDevelop 2.4.2

需要下载的文件列表如下:

  • Mono运行时:mono-2.10.2.tar.bz2
  • GTK Bind:gtk-sharp-2.12.10.tar.bz2
  • GNOME Bind:gnome-sharp-2.24.1.tar.bz2
  • Mono Addins:mono-addins-0.6.1.tar.bz2
  • GDI+的Linux移植版本:libgdiplus-2.10.tar.bz2
  • MonoDevelop:monodevelop-2.4.2.tar.bz2

可以从这里进行下载:
http://ftp.novell.com/pub/mono/sources/

  1. 安装Mono运行时
tar -xvf mono-2.10.2.tar.bz2
cd mono-2.10.2
./configure --prefix=/usr
make 
make install

整个过程应该不存在大的问题

  1. 由于MonoDevelop需要其他的一些依赖库,这些库在系统中没有默认安装,Mono运行时也没有直接提供,所以这里要手动安装

安装GDI+

tar -xvf libgdiplus-2.10.tar.bz2
cd libgdiplus-2.10
./configure --prefix=/usr
make
make install
  1. 安装GTK Bind
tar -xvf gtk-sharp-2.12.10.tar.bz2
cd gtk-sharp-2.12.10
./configure --prefix=/usr
make 
make install
  1. 安装GNOME Bind

安装目前版本的GNOME Bind的时候,由于版本更新有些不同步,所以直接编译会出现Mono.GetOptions.dll找不到的错误提示,这里需要注意修正以下Makefile文件

tar -xvf gnome-sharp-2.24.1.tar.bz2
cd gnome-sharp-2.24一 
./configure --prefix=/usr

Makefile文件生成之后,这里需要修改sample相关文件的Makefile

由于这里的Mono.GetOptions.dll被开发组重命名为Mono.Options.dll,但是GNOME Bind包还没有及时更新,所以回会出现找不到该dll的问题,考虑到该dll只是在测试程序TestXfer.exe中使用,影响不大,所以这里直接注释掉TestXfer.exe的生成和运行即可。

进入子目录sample/gnomevfs,打开其中的Makefile文件,将如下几行注释掉就可以了:

注释掉221行:

EXTRA_TARGET = TestXfer.exe

注释掉449和450行:

TestXfer.exe: $(srcdir)/TestXfer.cs $(assemblies)

$(CSC) /out:TestXfer.exe $(references) -r:Mono.GetOptions.dll $(srcdir)/TestXfer.cs

然后退出子目录,进入到父目录gtk-sharp-2.12.10,继续执行:

make
make install
  1. 安装Mono Addins
tar -xvf mono-addins-0.6.1.tar.bz2
cd mono-addins-0.6.1
./configure --prefix=/usr
make
make install
  1. 安装完成相关依赖之后,就可以开始安装Monoevelop了
tar -xvf monodevelop-2.4.2.tar.bz2
cd monodevelop-2.4.2
./configure --prefix=/usr
make 
make install

截张图过来:
1.png

(转)Windows 7 下无法使用DevPartner BoundsChecker 9.1进行调试的问题

问题描述如下:

点击Start with Error Detection时回出现错误提示,显示无法打开dpinjsvc服务

进一步的错误提示如下:

CRunManager::InjectNow() - BCAX::StartRecording() FAILED: hr = 0x80004005

解决方法:

添加localhost到127.0.0.1的本地DNS映射

在%WinDir%/System32/Drivers/Etc目录中,编辑hosts文件,在末尾添加两行

127.0.0.1 localhost

::1 localhost

然后重新启动计算机即可

这是官方给出的解决方案,经测试,能够解决问题,看来BoundsChecker的机制也是基于远程调试的。。。