cuda runtime库不是线程安全的?

Explorer 2009-08-13 01:58:01
因为应用需要cpu侧需要多个线程并发调用一个包含cuda计算的库,发现在运行中有些线程会挂死的现象。后来经过简化发现就算是单独的一个cudaMalloc也会出现线程挂死的问题。测试平台为windows xp,cuda 2.3。
是用法不对还是cuda运行库本身不是线程安全的?

测试代码如下:

#include <stdio.h>
#include <cuda_runtime.h>
#include <cutil_inline.h>
#include <process.h>
#include <windows.h>

#define GRD 45
#define BLK 16
#define SIZE (GRD * GRD * BLK * BLK)

DWORD test(void *tid)
{
char *src_g;
char *src_c;

int id = (int)tid;

printf("before cudaSetDevice(%d)\n", id);
cutilSafeCall(cudaSetDevice(0));

printf("before cudaMalloc(%d)\n", id);
cutilSafeCall(cudaMalloc((void**) &src_g, SIZE));
cutilSafeCall(cudaFree(src_g));

printf("thread %d ok.\n", id);

return 1;
}

int main(int argc, char *argv[])
{
HANDLE h1 = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)test, (void*)1, 0, 0);
HANDLE h2 = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)test, (void*)2, 0, 0);
test(0);

// wait other threads
WaitForSingleObject(h1, INFINITE);
WaitForSingleObject(h2, INFINITE);
CloseHandle(h1);
CloseHandle(h2);

return 0;
}


上面测试程序经常出现如下打印然后就无法退出了:
before cudaSetDevice(1)
before cudaSetDevice(0)
before cudaSetDevice(2)
before cudaMalloc(1)
before cudaMalloc(2)
before cudaMalloc(0)
thread 1 ok.
...全文
368 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Explorer 2009-09-01
  • 打赏
  • 举报
回复
此方法基本可行(还是有较小的几率会无法退出,几率比不调用这个函数要小很多)。后来在release notes里面找到如下说明:
o It is a known issue that cudaThreadExit() may not be called implicitly on
host thread exit. Due to this, developers are recommended to explicitly
call cudaThreadExit() while the issue is being resolved.

多谢!

[Quote=引用 4 楼 ilkxilkx 的回复:]
引用 2 楼 explorer 的回复:
多卡情况没环境测,不过也觉得cuda本身应该做到线程安全,否则多线程/单卡应用不是很麻烦?
不知大家有没测试过上面代码,能重现出和我一样的问题吗?如果能重现不会是sdk的bug吧?

请在test函数的 return 1;语句前加上 cudaThreadExit();

[/Quote]
Explorer 2009-09-01
  • 打赏
  • 举报
回复
id本身仅用于区分线程的,我电脑只有一块显卡,所以使用cudaSetDevice(0)

[Quote=引用 5 楼 openhero 的回复:]
= =!
bug!
    printf("before cudaSetDevice(%d)\n", id);
    cutilSafeCall(cudaSetDevice(0));-----》 id;
[/Quote]
OpenHero 2009-08-20
  • 打赏
  • 举报
回复
= =!
bug!
printf("before cudaSetDevice(%d)\n", id);
cutilSafeCall(cudaSetDevice(0));-----》 id;
Explorer 2009-08-14
  • 打赏
  • 举报
回复
多卡情况没环境测,不过也觉得cuda本身应该做到线程安全,否则多线程/单卡应用不是很麻烦?
不知大家有没测试过上面代码,能重现出和我一样的问题吗?如果能重现不会是sdk的bug吧?
ilkxilkx 2009-08-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 explorer 的回复:]
多卡情况没环境测,不过也觉得cuda本身应该做到线程安全,否则多线程/单卡应用不是很麻烦?
不知大家有没测试过上面代码,能重现出和我一样的问题吗?如果能重现不会是sdk的bug吧?
[/Quote]
请在test函数的 return 1;语句前加上 cudaThreadExit();
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 explorer 的回复:]
多卡情况没环境测,不过也觉得cuda本身应该做到线程安全,否则多线程/单卡应用不是很麻烦?
不知大家有没测试过上面代码,能重现出和我一样的问题吗?如果能重现不会是sdk的bug吧?
[/Quote]

是很麻烦.
cuda其实最早好像只有驱动层API,其中,驱动上下文就是一个context控制的.如要线程安全,则驱动会很复杂.毕竟,cuda的重点在gpu上而不是cpu.
  • 打赏
  • 举报
回复
该不是.不然也不用强调一个线程处理一块卡.

589

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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