求助关于显存数据的共享问题

zhui22222 2010-06-30 08:32:02

void* memInit(int size)
{
void* d_buffer;
cudaMalloc((void**)&d_buffer, size);
return d_buffer;
}
void memCpy(short* srcData,int len,void* d_buffer)
{
cudaMemcpy(d_buffer, (void*)srcData, sizeof(short)*len, cudaMemcpyDeviceToHost);
}
void memFree(void* d_buffer)
{
cudaFree(d_buffer);
}
void work(short* dstData, int len, void* d_buffer)
{
cudaMemcpy((void*)dstData, d_buffer, sizeof(short) * len, cudaMemcpyDeviceToHost);
}

应用:
在cpu线程1中申请显存并写入数据:
ptr = memInit(size)//ptr为全局变量(void*)
memCpy(srcData,len,ptr);
cpu线程2、3、4...中读取数据:
work(dstData,len,ptr);

最后调用memFree(ptr)释放;

调试时发现线程2、3、4等dstData无数据,而将代码放入同一线程work函数是可以返回数据的。
是不是显存数据不能在不同的线程间共享?如何才能共享?

...全文
126 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhui22222 2010-07-01
  • 打赏
  • 举报
回复
2楼能否说的再详细一点?驱动api一直没去研究,还不是很清楚
  • 打赏
  • 举报
回复
我blog上也有一个例子.
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhui22222 的回复:]
2楼能否说的再详细一点?驱动api一直没去研究,还不是很清楚
[/Quote]

看《编程手册》。另外一套独立的api体系。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 skfeng36 的回复:]
每次都先将显存的数据复制到内存中(作为全局变量)然后再让别的线程使用。。
[/Quote]

LZ说的好像是主机线程。不是kernel中的thread.....呵呵。
  • 打赏
  • 举报
回复
每次都先将显存的数据复制到内存中(作为全局变量)然后再让别的线程使用。。
  • 打赏
  • 举报
回复
数据其实是在显卡上,当然也可以共享的。

1)主机的不同线程间可以控制同一显卡(虽然不推荐),但要用相同的上下文操作--用驱动层API(cu系列函数).
2)用应用层API(cuda系列函数)的话,主机的不同线程应该对应不同的上下文(自动设置的),因此LZ可以看一下,其实,有一些cuda调用虽然返回了,但其实执行结果是错误的。cudaGetLastError()返回的不是cudaSuccess。
zh848024897 2010-06-30
  • 打赏
  • 举报
回复
沙发
不是很懂

580

社区成员

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

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