cuPrintf问题

我正在尝试将一个struct数组复制到device.I我正在使用一个GPU atm,我有一个cuPrintf函数的问题,我用它来调试我的代码。

我的结构定义如下:

struct Node { char Key[25]; char ConsAlterKey[25]; char MasterKey[3]; int VowelDeletion; char Data[6]; char MasterData[6]; int Children[35]; int ChildCount; }; 

为了测试目的,我填充struct数组,如下所示:

 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; } } } 

我的主要function如下:

 int main() { Node *NodeArray; Node *GpuTree; int tokenCount=0; int *tokenCountGPU; NodeArray =(Node *)malloc(sizeof(Node)*(TotalNodeCount)); FillArray(NodeArray); printf("Filling test : %s\n", NodeArray[13].Key); gpuAssert(cudaMalloc( (void**)&GpuTree, sizeof(Node)*(TotalNodeCount))); gpuAssert(cudaMemcpy(GpuTree, NodeArray,sizeof(Node)*(TotalNodeCount), cudaMemcpyHostToDevice)); //test value tokenCount=35; gpuAssert( cudaMalloc((void **)&tokenCountGPU, sizeof(int)) ); gpuAssert( cudaMemcpy(tokenCountGPU, &tokenCount, sizeof(int), cudaMemcpyHostToDevice) ); cudaPrintfInit(); Test <<>> (GpuTree,tokenCountGPU); cudaPrintfDisplay(stdout, true); cudaPrintfEnd(); gpuAssert( cudaGetLastError() ); //TODO:free pointers return(0); } 

如果我写测试function如下:

 __global__ void Test(Node *Trie,int *tokenCount) { if (threadIdx.x < *tokenCount) { cuPrintf("%s\n",Trie[threadIdx.x].Key); } return; } 

我得到这样的输出:

 Filling test : Key [0, 0]: < [0, 1]: ¶☺! [0, 2]: ì☺! [0, 3]: Ä☻! [0, 4]: o♥! [0, 5]: t♦! [0, 6]: L♣! [0, 7]: $♠! [0, 8]: ü♠! [0, 9]: Ô! [0, 10]: ! [0, 11]: " [0, 12]: \ ! [0, 13]: 4♂! [0, 14]: ♀♀! [0, 15]: ä♀! !0, 16]: ¼ [0, 17]: "♫! [0, 18]: l☼! [0, 19]: D►! [0, 20]: ∟◄! [0, 21]: ô◄! [0, 22]: Ì↕! [0, 23]: ¤‼! [0, 24]: |¶! [0, 25]: T§! [0, 26]: ,▬! [0, 27]: ♦↨! [0, 28]: Ü↨! [0, 29]: ´↑! [0, 30]: O↓! [0, 31]: d→! [0, 32]: <←! [0, 33]: ¶∟! [0, 34]: ì∟! 

但如果我改变我的测试方法:

 __global__ void Test(Node *Trie,int *tokenCount) { if (threadIdx.x < *tokenCount) { cuPrintf("%c%c%c\n", Trie[threadIdx.x].Key[0], Trie[threadIdx.x].Key[1], Trie[threadIdx.x].Key[2]); } return; } 

然后我得到正确的输出:

 Filling test : Key [0, 0]: Key [0, 1]: Key [0, 2]: Key [0, 3]: Key [0, 4]: Key [0, 5]: Key [0, 6]: Key [0, 7]: Key [0, 8]: Key [0, 9]: Key [0, 10]: Key [0, 11]: Key [0, 12]: Key [0, 13]: Key [0, 14]: Key [0, 15]: Key [0, 16]: Key [0, 17]: Key [0, 18]: Key [0, 19]: Key [0, 20]: Key [0, 21]: Key [0, 22]: Key [0, 23]: Key [0, 24]: Key [0, 25]: Key [0, 26]: Key [0, 27]: Key [0, 28]: Key [0, 29]: Key [0, 30]: Key [0, 31]: Key [0, 32]: Key [0, 33]: Key [0, 34]: Key 

所以问题是当我尝试使用“%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 

看一下cuPrintf文档(自述文件位于安装SDK的基本目录下的C / src / simplePrintf / doc / cuPrintf_readme.htm ):

关于cuPrintf的使用存在限制/已知问题,2号回答了您的问题:

限制/已知问题

目前,以下限制和限制适用于cuPrintf:

  1. 缓冲区大小向上舍入到最接近的因子256
  2. 与“%s”字符串格式说明符关联的参数必须是 类型(const char *)
  3. 要打印(const char *)指针的值,必须先将其转换为(char *)。 所有(const char *)参数都被解释为字符串
  4. 非零返回码与标准C printf()不匹配
  5. 无法异步输出printf缓冲区(即内核运行时)
  6. 调用cudaPrintfDisplay隐式发出cudaDeviceSynchronize()
  7. cuPrintfRestrict应用的限制在启动之间持续存在。 要从主机端清除这些,您必须再次调用cudaPrintfEnd()然后再调用cudaPrintfInit()
  8. 如果将多个模块加载到单个上下文中,则cuPrintf输出未定义
  9. 尽可能使用“-arch = sm_11”编译或更好。 缓冲区使用效率更高,寄存器使用率更低
  10. 支持的格式说明符是:“cdiouxXeEfgGaAs”
  11. 格式说明符的行为,尤其是对齐/大小说明符,取决于主机的printf实现
  12. cuPrintf要求使用CUDA运行时API构建应用程序

在您的情况下,您不使用const char*参数。

你的结构的一个成员是

  char MasterKey[3]; 

当你初始化你做的对象时

  //strcpy(NodeArray[i].MasterKey,"MasterKey"); strcpy(NodeArray[i].MasterKey,"Msk"); /* still too large */ 

这对于可用空间来说太多了(!)。

在您最近的更新中,您需要在复制时使用sizeof(char) < - 多个slenz。 所以它应该是:

 gpuAssert( cudaMemcpy(strGPU, str, slenz*sizeof(char), cudaMemcpyHostToDevice));