问题是这样的。我在一个程序内开辟了两个线程,分别调用使用GPU的库文件。
程序有时候可以正常运行,有时候就会不执行停止在GPU计算的部分。
使用cuda3.2版本会有此问题,但cuda4.2可以正常运行通过,但是很慢。两种版本分别测试了数千次。
请问多线程单GPU编程有什么要注意的地方嘛。还有就是为什么3.2和4.2会有如此差异。
运行环境是32位win7,显卡GTX580。
对于CUDA 3.2和4.2来说,他们在“多host线程方面”无区别。
您确定您不是分别用的3.1和4.2吧?它们区别还是很大的。3.2一下的版本,多个host thread将使用独立的cuda context, 而3.2+的版本,则一个进程中的多个线程将会共享一个context。
所以3.2和4.2之间出问题应该不可能。
以及,您提供的信息不是很充足,只能分析到这里。如果需要继续分析,欢迎继续提供相关代码等信息。谢谢!
只要您使用的是3.2+(包含)版本的cuda runtime, 那么它们不会有“如此差异”的。
以及,
3.2+版本的“多线程,单GPU”编程上没有特别需要注意的事项。
3.2以下版本的runtime api, 还是需要注意,多个线程中的一些数据实际上是独立的副本,(例如同一个__device__ type var;在多个host thread上看到的不相关的同名副本)。以及,一个线程计算出错,无法在另外一个线程中检测到。但是3.2+均无这些问题。
感谢版主的回复。刚才确认了,确实使用的是3.2版本的cuda。
使用的是cudart32_32_16.dll这个库。
会不会有可能是程序设计等方面的缺陷导致这种情况的发生呢。
还有就是4.2版本虽然可以运行通过,但是运行时间明显很慢,gtx580显卡gpu计算部分大概使用了14秒。
而在我自己的笔记本上,4.2的版本,使用nvs4200m显卡,大概只需要3秒钟。
感谢您的反馈。
您的猜测“会不会有可能是程序设计等方面的缺陷导致这种情况的发生”是有可能的。
以及,根据您的描述,在您的台式机上,同样是4.2,需要GPU运算14秒,但是在您的笔记本上,却只需要3秒。所以是cuda runtime的问题可能性不大。
我建议:
(1)仔细检查是否存在程序设计方面的缺陷。
(2)仔细检查笔记本和台式机运行环境上的差异。
嗯,感谢您的帮助。
程序设计的时候是分两个线程同时处理两组相同的数据。所以调用的也是同一个处理库。
但该库因为设计的原因(使用静态参数等),所以需要在程序下分别建立两个目录,存放
两个相同的计算库,然后分别加载调用。而且初始化显卡的部分被放在处理库中进行了。
即很可能一个线程正在计算的时候,另一个线程可能刚进入需要初始化显卡setdevice()
这会是产生问题的原因所在吗?
谢谢!
无法直接简单的从外在现象推断出“该库”的内部原理是否如此。
我的建议:
(1)如果该库是你们写的,请提供代码以便分析问题。
(2)如果该库是第三方提供的,请联系第三方的技术支持。
嗯,好的。谢谢。
如果有需要会再和您联系。
您拒绝接受上个建议中的任何一条。那我也无能为力了。
感谢您的来访,祝您工作愉快。