C 铜印问题
我正在尝试将一个结构数组复制到设备。我正在使用一个GPU atm,并且我在使用cuPrintf函数调试代码时遇到问题 我的结构定义如下:C 铜印问题,c,gpu,cuda,C,Gpu,Cuda,我正在尝试将一个结构数组复制到设备。我正在使用一个GPU atm,并且我在使用cuPrintf函数调试代码时遇到问题 我的结构定义如下: struct Node { char Key[25]; char ConsAlterKey[25]; char MasterKey[3]; int VowelDeletion; char Data[6]; char MasterData[6];
struct Node
{
char Key[25];
char ConsAlterKey[25];
char MasterKey[3];
int VowelDeletion;
char Data[6];
char MasterData[6];
int Children[35];
int ChildCount;
};
__global__ void Test(Node *Trie,int *tokenCount)
{
if (threadIdx.x < *tokenCount)
{
cuPrintf("%s\n",Trie[threadIdx.x].Key);
}
return;
}
出于测试目的,我填充结构数组如下:
void FillArray(Node *NodeArray)
{
for(int i=0;i<TotalNodeCount;i++)
{
strcpy(NodeArray[i].Key,"Key");
strcpy(NodeArray[i].ConsAlterKey,"ConsAlterKey");
strcpy(NodeArray[i].MasterKey,"Mk");
NodeArray[i].VowelDeletion=0;
strcpy(NodeArray[i].Data,"Data");
strcpy(NodeArray[i].MasterData,"Mdata");
NodeArray[i].ChildCount=5;
for(int j =0;j<NodeArray[i].ChildCount;j++)
{
NodeArray[i].Children[j]=i+j;
}
}
}
所以问题是,当我试图使用“%s”打印字符串时,为什么会得到损坏的输出
所以问题解决了。看起来是因为cuPrintf的限制。事实上我不知道,谢谢 下面是一个小测试:
__global__ void Test(Node *Trie,int *tokenCount)
{
const char *Key="Key";
char *KeyPointer="Key";
char KeyArray[4]="Key";
cuPrintf("Constant : %s - Array :%s - Pointer : %s - Casting Pointer : %s - Casting Array : %s\n",Key, KeyArray,KeyPointer,(const char *)KeyPointer,(const char *)KeyArray);
//cuPrintf("%s\n",Trie[threadIdx.x].Key);
//cuPrintf("%d\n",*tokenCount);
}
给出输出:
[0, 0]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 1]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 2]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 3]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 4]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 5]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 6]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 7]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 8]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 9]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 10]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 11]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 12]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 13]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 14]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 15]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 16]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 17]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 18]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 19]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 20]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 21]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 22]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 23]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 24]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 25]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 26]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 27]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 28]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 29]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 30]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 31]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 32]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 33]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 34]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
在最近的更新中,您需要通过
sizeof(char)
将多个slenz添加到结构的一个成员中
char MasterKey[3];
当你初始化对象的时候
//strcpy(NodeArray[i].MasterKey,"MasterKey");
strcpy(NodeArray[i].MasterKey,"Msk"); /* still too large */
这对于可用空间来说太多了。请查看
cuPrintf
文档(自述文件位于安装SDK的基本目录中的C/src/simplePrintf/doc/cuPrintf\u readme.htm):
关于cuPrintf
的使用存在限制/已知问题,第2个问题回答了您的问题:
限制/已知问题
目前,存在以下限制:
对cuPrintf的限制如下:
在您的情况下,您没有使用
const char*
参数。打印出childCount
怎么样?gpu是否能够从结构中提取整数?记录在案,这一切似乎都很奇怪。我在上面的代码中没有看到任何问题。哦,还有,你能把sizeof(Node)
打印出来吗?很抱歉我的回答迟了。sizeof(Node)是216。正如你所说,我已经更新了代码,但仍然一无所获。也许我的cuPrintf.cu版本有问题。无论如何,我不想用这个新手问题打扰你,因为我已经解决了代码中的问题,我现在不需要cuPrintf。事实上,我将发布一个关于我当前代码的性能指导的新问题。我希望你会帮助我:)所以我刚刚建议在内核中使用printf
s,直到我意识到你需要一个具有计算能力2.x(费米)的设备。废话。回到绘图板…当事情不顺利时,我发现我学到了更多。。。我仍然无法理解为什么上面的代码不能产生预期的结果——因此是赏金——让我们吸引更好的头脑吧!现在是MasterData[6]:strcpy(noderray[i]。MasterData,“Master”)代码>。假设cuPrintf
的行为与printf
相同,如果您将输出限制为3个字符:cuPrintf(“%3.3s\n”,Trie[threadIdx.x].Key)
完成,但我仍然使用cuPrintf(“%3.3s\n”,Trie[threadIdx.x].Key)获得损坏的输出代码>您使用的是哪种GPU?TotalNodeCount设置为什么?@meva:这个测试可以,但是现在,如果您在调用cuPrintf
的过程中将keyPointer
转换为(const char*)
,该怎么办我的头撞在墙上——看起来是正确的,但标准的printf语法不完全受支持。@M.Tibbits:我刚刚检查了实现,它看起来有点粗糙:)OP使用强制转换进行测试或重写函数以接受char*会很有趣。我个人正处于另一个项目的时间紧迫期——因此我提供了奖金并“暂停”了我的努力。
__global__ void Test(Node *Trie,int *tokenCount)
{
const char *Key="Key";
char *KeyPointer="Key";
char KeyArray[4]="Key";
cuPrintf("Constant : %s - Array :%s - Pointer : %s - Casting Pointer : %s - Casting Array : %s\n",Key, KeyArray,KeyPointer,(const char *)KeyPointer,(const char *)KeyArray);
//cuPrintf("%s\n",Trie[threadIdx.x].Key);
//cuPrintf("%d\n",*tokenCount);
}
[0, 0]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 1]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 2]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 3]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 4]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 5]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 6]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 7]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 8]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 9]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 10]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 11]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 12]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 13]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 14]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 15]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 16]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 17]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 18]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 19]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 20]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 21]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 22]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 23]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 24]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 25]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 26]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 27]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 28]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 29]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 30]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 31]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 32]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 33]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
[0, 34]: Constant : Key - Array : - Pointer : ♀ - Casting Pointer : Key - Casting Array : Key
gpuAssert( cudaMemcpy(strGPU, str, slenz*sizeof(char), cudaMemcpyHostToDevice));
char MasterKey[3];
//strcpy(NodeArray[i].MasterKey,"MasterKey");
strcpy(NodeArray[i].MasterKey,"Msk"); /* still too large */