我正在尝试将一个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 : %sn", 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("%sn",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%cn", 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 : %sn",Key, KeyArray,KeyPointer,(const char *)KeyPointer,(const char *)KeyArray); //cuPrintf("%sn",Trie[threadIdx.x].Key); //cuPrintf("%dn",*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:
在您的情况下,您不使用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));
以上就是c/c++开发分享cuPrintf问题相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/560383.html