cuda中数组传送的问题

huql_2046 2011-04-12 11:55:27

int maxIdx = 0;
int num_h[8] = {1, 3, 5, 7, 8, 6, 4, 2};
int *p = (int*)malloc(1 * sizeof(int));
float *num_d; //显存中存放
cutilSafeCall(cudaMalloc((void**)&num_d, sizeof(int) * 8));

cutilSafeCall(cudaMemcpy(num_d, num_h, 8 * sizeof(int), cudaMemcpyHostToDevice));
maxIdx = cublasIsamax(N, num_d, 1) - 1; //此处调用的是CUBLAS库函数
printf("数组中最大值所在的位置:%d\n", maxIdx);
cutilSafeCall( cudaMemcpy(&num_d[maxIdx], p, sizeof(int) * 1, cudaMemcpyDeviceToHost));
printf("最大值为:%d\n", *p);

cutilSafeCall(cudaFree(num_d));
free(p);

以上代码显示runtime API error:invalid argument。
我的本意不是将设备端一个数组中的值全部传送到主机端。而是希望将设备端数组中最大值的元素传送到主机端。
请问大侠们,如何处理?
...全文
630 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
liujuan99 2011-11-01
  • 打赏
  • 举报
回复
二楼正解啊
cuda007 2011-09-08
  • 打赏
  • 举报
回复
由于你的p是用在设备端存放最大值的,所以是应该为p分配显存而不是内存。用cudamalloc()函数。
cutilSafeCall( cudaMemcpy(&num_d[maxIdx], p, sizeof(int) * 1, cudaMemcpyDeviceToHost)这个表明你p是在设备端的,怎能又在主机端开内存呢?
yqwang2006 2011-08-27
  • 打赏
  • 举报
回复
除了楼上所说之外,maxIdx应该是你调用库函数后得到的主机端的变量吧?我不清楚这个返回值返回到主机还是设备了,如果是主机端那就不能直接在设备的数组中使用去定位。
dwdm 2011-08-01
  • 打赏
  • 举报
回复
num_d是device端的,p是host端的,cutilSafeCall( cudaMemcpy(&num_d[maxIdx], p, sizeof(int) * 1, cudaMemcpyDeviceToHost));这句把target和source搞反了。呵呵
tctiantc1 2011-06-09
  • 打赏
  • 举报
回复
我也遇到了相同问题,请问有人能解决下么

231

社区成员

发帖
与我相关
我的任务
社区描述
CUDA on Windows XP
社区管理员
  • CUDA on Windows XP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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