这是本文所选答案的后续问题:cuda程序的输出不是预期的 https://stackoverflow.com/questions/6561005/output-of-cuda-program-is-not-what-was-expected/6561375#6561375.
虽然以下功能有效:
__global__ void setVal(char **word)
{
char *myWord = word[(blockIdx.y * gridDim.x) + blockIdx.x];
myWord[0] = 'H';
myWord[1] = 'e';
myWord[2] = 'l';
myWord[3] = 'l';
myWord[4] = 'o';
}
为什么这不起作用?
__global__ void setVal(char **word)
{
char *myWord = word[(blockIdx.y * gridDim.x) + blockIdx.x];
myWord = "Hello\0";
}
您应该开始更加关注编译器的输出。你的第二个内核代码:
__global__ void setVal(char **word)
{
char *myWord = word[(blockIdx.y * gridDim.x) + blockIdx.x];
myWord = "Hello\0";
}
编译为空内核,其中没有任何内容:
$ nvcc -arch=sm_20 -c nullkernel.cu
nullkernel.cu(3): warning: variable "myWord" was set but never used
nullkernel.cu(3): warning: variable "myWord" was set but never used
原因是因为你认为的字符串复制赋值实际上只是一个指针赋值,在这种情况下,编译器足够聪明,知道 myWord 没有写入内存,所以它只是删除所有代码并警告你未使用 myWord。
如果我问一个反问句并这样重写代码:
__global__ void setVal(char **word)
{
char *myWord = word[(blockIdx.y * gridDim.x) + blockIdx.x];
const char[] mymsg = "Hello\0";
myWord = mymsg;
}
为什么代码无法编译以及为什么即使编译了也永远不能“隐式”执行字符串复制赋值会更加明显?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)