用户
 找回密码
 立即注册
cudaabc 该用户已被删除
发表于 2013-5-16 17:07:33
68838
运行cuda 5.0 Sample里的threadMigration的例子 有些不大明白 KernelFunction(int * input) 这个函数的参数值能不能从host代码部分赋值然后传递给Kernel
我把  cuLaunchKernel部分的参数改了一下,但没有在外面改变input的值
       ////void *args[5] = { &pParams->dptr };
        ////
        int a[5] = {1,2,3,4,5};
        void *args[5] = {&a};
        ////

使用道具 举报 回复
发表于 2013-5-16 17:15:07
本帖最后由 横扫千军 于 2013-5-16 17:20 编辑

首先恭喜楼主更进一步,开始尝试driver api了。

我建议您将您的写法改成这样:
void *p = a;
args[0] = &p;
以及这样改正后,依然是不可以的:

原因如下:

对于__global__ void cudaabc(int *p) { ... }
您的p应当指向一段global memory中的缓冲区的。

而您试图给出的参数,会导致一个在host线程的stack上的地址,然后将此地址用在kernel中。这做不到的。

使用道具 举报 回复 支持 反对
发表于 2013-5-16 17:28:19
横扫千军 发表于 2013-5-16 17:15
首先恭喜楼主更进一步,开始尝试driver api了。

我建议您将您的写法改成这样:

我继续说一下为何有这2个情况。

(1)cuLaunchKernel需要给出的参数的地址构成的数组。
根据您的意图。您试图将host stack上的int a[5]传递给kernel作为int *input这种的参数,即您需要将host上的该数组的首地址传递过去。那么您只能先像上文那样,赋值到一个指针(指针的值是这个首地址),然后将指针的地址写到参数数组里。

而您直接用&a是行不通的,那样会导致参数数组里的地址是该数组的首地址(外加数组维度信息).
所以我建议您将:
int a[5] = ...;
(&a, ....);
改成:
int a[5] = ...;
void *p = a;
(&p, ....);

(2)您除了这个地址准备上的BUG, 你还有个问题。
那就是kernel无法直接使用host memory。
所以就算您的参数正确传递了,这样也会导致运行错误。这个已经在上文说了。
使用道具 举报 回复 支持 反对
发表于 2013-5-16 18:05:48
但是我改成上面这样以后,也还不对啊

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
使用道具 举报 回复 支持 反对
发表于 2013-5-16 18:15:50
cudaabc 发表于 2013-5-16 18:05
但是我改成上面这样以后,也还不对啊

我狂晕。请仔细看上文。

我从来没说你这样行。我只是指出了你的2个问题。

以及,如果你不明白,还是用runtime api吧。

你上文用了&p,  然后你下文就直接无视了这个数组。还是用的原来例子的params->dptr.
请问你这样还有何意义?

既然你糊涂到这个分上,还是不要尝试使用context了。你直接使用runtime api吧(普通的<<<>>>形式的启动)。。。

请不要生气,这也是为你好。本身混混沌沌的没有任何意义。
使用道具 举报 回复 支持 反对
发表于 2013-5-16 18:18:57
横扫千军 发表于 2013-5-16 18:15
我狂晕。请仔细看上文。

我从来没说你这样行。我只是指出了你的2个问题。

您要知道,我只能在您明白您要干什么的情况下,才能为您建议出您哪里不对。

但是我完全没有义务告诉你要干的是什么,再告诉你怎么干。

知道自己的问题是什么是提问者的义务。
而在这个前提下给出解答才是我的责任。

我完全无需为你指出干什么,再自我回答怎么干。
请原谅。
使用道具 举报 回复 支持 反对
发表于 2013-5-16 21:18:19
实际上 cuLaunchKernel (...,NULL,NULL,NULL) 后面的参数改成NULL也没有任何影响,而后面的参数是声明为void ** kernelParams的。
如果不能传host的参数过去的话,这个不叫thread migration。是把ptx编译成可执行码,然后使用cuLaunchKernel函数在内核执行一下。
所以需要向您咨询一下。
使用道具 举报 回复 支持 反对
发表于 2013-5-16 21:55:33
cudaabc 发表于 2013-5-16 21:18
实际上 cuLaunchKernel (...,NULL,NULL,NULL) 后面的参数改成NULL也没有任何影响,而后面的参数是声明为voi ...

。。。。。。。

我决定将你移动到灌水专区。

你可以选择投诉我。但是我依然要作出这个决定。
使用道具 举报 回复 支持 反对
发表于 2013-5-17 17:03:07
cuda支持thread migration 照着别的地方写的例子运行成功了
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册