如何将list传到cuda里进行处理?

tyler_durden 2014-04-23 12:32:29
如何将list传到cuda里进行处理

数据结构:
struct t_pixel
{
unsigned char blue,green,red,alpha;
}
用来保存图像

std::list<t_pixel*> images;
这个list来储存图像序列

t_pixel *image1=new t_pixel[SIZE];
images.push_front(image1);
这样储存图像序列

这样图像都是在内存里的

我要怎么把图像传到显存?是要写一个cuda的list,把内存图像拷到显存么?
...全文
2013 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
prettyjoy 2014-06-21
  • 打赏
  • 举报
回复
安卓手机oppor801 4.0以上的刷机包安卓手机oppor801 4.0以上的刷机包
qq_16676485 2014-06-19
  • 打赏
  • 举报
回复
学习了。赞一个,很受用
_梦魇花葬 2014-06-19
  • 打赏
  • 举报
回复
1. 可以将list拷贝到数组中,因为CUDA只识别数组,而不识别List。 2. 自己定义CUDA list结构体。 3. 使用trust的vector代替list。
limengdeai 2014-06-19
  • 打赏
  • 举报
回复
含笑452 2014-06-17
  • 打赏
  • 举报
回复
好好学习 。。
lixiangyu8682 2014-06-17
  • 打赏
  • 举报
回复
学习一个。很好
qq_16622291 2014-06-17
  • 打赏
  • 举报
回复
非常不错,看过了
qq_16622009 2014-06-17
  • 打赏
  • 举报
回复
谢谢分享谢谢
bluesilentgarbage 2014-06-17
  • 打赏
  • 举报
回复
不错哦~~学习啦~
baidu_16566455 2014-06-15
  • 打赏
  • 举报
回复
好吧bghj yhj
qq_16564427 2014-06-15
  • 打赏
  • 举报
回复
把它们全部卸载,就可以了。
qq_16563845 2014-06-15
  • 打赏
  • 举报
回复
把它们全部卸载,就可以了。
qq_16563845 2014-06-15
  • 打赏
  • 举报
回复
知道了,我也学习了
yhyahqq 2014-06-14
  • 打赏
  • 举报
回复
定义 t_pixel* images_c[100]; t_pixel** images_g; cudaMalloc((void **)&images_g,sizeof(t_pixel)*images.size());//根据images的数量,申请显存 for(int i=0;i<images.size();i++) { cudaMalloc((void **)&images_c[i],SIZE); //根据images的数量(images.size())申请显存 } 内存中images_c这个数组里储存的就是显存地址。 cudaMemcpy(images_g,images_c,sizeof(t_pixel)*images.size(),cudaMemcpyHostToDevice); //将储存显存地址的这块内存拷贝到显存中,images_g储存这个显存地址。 就是说images_g指向的显存中储存了 图像在 显存中的地址。 这样在kernel函数中就可以用images_g来寻找到显存中的图像。
xiaocainiao0520 2014-06-14
  • 打赏
  • 举报
回复
学习了。赞一个
feiyanghot 2014-06-14
  • 打赏
  • 举报
回复
不错,学习了
linxxx3 2014-04-24
  • 打赏
  • 举报
回复
引用 3 楼 tyler_durden 的回复:
[quote=引用 1 楼 linxxx3 的回复:] 如果程序逻辑是每次只处理一副图像的话,只需要写处理单个图像的kernel,然后每次传一副图进显存处理。这样实现起来最简单。
是我需要处理list里的所有图像(将这些带alpha通道的图像进行合成),在一个kernel里完成。 当然,我也可以每次处理list里的两个图像(进行合成),也能完成所有图像的处理,但是这样的效率不如一次性的处理吧?[/quote] 那合适的就是批处理了。根据显存的大小,确定gpu一次处理的最大图片数量N,直接申请一大块显存。每次从cpu传N张图片进显存,小于N就按实际数量算。这样可以避免可能存在显存不够的问题,也不用在kernel里写list,使用图片序号直接可以计算出图片数据起始地址。
tyler_durden 2014-04-23
  • 打赏
  • 举报
回复
引用 1 楼 linxxx3 的回复:
如果程序逻辑是每次只处理一副图像的话,只需要写处理单个图像的kernel,然后每次传一副图进显存处理。这样实现起来最简单。
是我需要处理list里的所有图像(将这些带alpha通道的图像进行合成),在一个kernel里完成。 当然,我也可以每次处理list里的两个图像(进行合成),也能完成所有图像的处理,但是这样的效率不如一次性的处理吧?
tyler_durden 2014-04-23
  • 打赏
  • 举报
回复
我目前的解决方法是这样的: 定义 t_pixel* images_c[100]; t_pixel** images_g; cudaMalloc((void **)&images_g,sizeof(t_pixel)*images.size());//根据images的数量,申请显存 for(int i=0;i<images.size();i++) { cudaMalloc((void **)&images_c[i],SIZE); //根据images的数量(images.size())申请显存 } 内存中images_c这个数组里储存的就是显存地址。 cudaMemcpy(images_g,images_c,sizeof(t_pixel)*images.size(),cudaMemcpyHostToDevice); //将储存显存地址的这块内存拷贝到显存中,images_g储存这个显存地址。 就是说images_g指向的显存中储存了 图像在 显存中的地址。 这样在kernel函数中就可以用images_g来寻找到显存中的图像。 有一个疑问,就是在cpu上用list就是为了避免数组的局限性(大小有限),而我现在这样解决,就又回到了数组,如果我想不受制于数组的大小,应该怎么办?问题又回到了写cuda的list?
linxxx3 2014-04-23
  • 打赏
  • 举报
回复
如果程序逻辑是每次只处理一副图像的话,只需要写处理单个图像的kernel,然后每次传一副图进显存处理。这样实现起来最简单。

353

社区成员

发帖
与我相关
我的任务
社区描述
CUDA高性能计算讨论
社区管理员
  • CUDA高性能计算讨论社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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