我正在尝试将一个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;
}
}
}
我的主要功能如下:
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 <<< 1, tokenCount >>> (GpuTree,tokenCountGPU);
cudaPrintfDisplay(stdout, true);
cudaPrintfEnd();
gpuAssert( cudaGetLastError() );
//TODO:free pointers
return(0);
}
如果我按如下方式编写测试功能:
__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
答案 0 :(得分:7)
查看cuPrintf
文档(自述文件位于安装SDK的基本目录中的 C / src / simplePrintf / doc / cuPrintf_readme.htm ):
使用cuPrintf
时存在限制/已知问题,第2号回答了您的问题:
限制/已知问题
目前,存在以下限制 和限制适用于cuPrintf:
- 缓冲区大小向上舍入到最接近的因子256
- 与“%s”字符串格式说明符关联的参数必须为 类型(const char *)
- 要打印(const char *)指针的值,首先必须是 转换为(char *)。全部(const char *)参数被解释为字符串
- 非零返回码与标准C printf()
不匹配- 无法异步输出printf缓冲区(即内核为 运行)
- 调用cudaPrintfDisplay会隐式发出一个问题 cudaDeviceSynchronize()
- cuPrintfRestrict应用的限制在两者之间存在 启动。从中清除这些 主持人,你必须打电话 cudaPrintfEnd()然后cudaPrintfInit() 再次
如果将多个模块加载到a中,则- cuPrintf输出未定义 单一背景
- 尽可能使用“-arch = sm_11”编译或更好。缓冲区用法是 效率和寄存器使用效率更高 下
- 支持的格式说明符为:“cdiouxXeEfgGaAs”
- 格式说明符的行为,尤其是对齐/大小 说明符,取决于主机 机器的printf实现
- cuPrintf要求使用CUDA运行时API构建应用程序
醇>
在您的情况下,您没有使用const char*
个参数。
答案 1 :(得分:1)
在您最近的更新中,您需要在复制时按sizeof(char)
&lt; - 进行多次细化。所以它应该是:
gpuAssert( cudaMemcpy(strGPU, str, slenz*sizeof(char), cudaMemcpyHostToDevice));
答案 2 :(得分:1)
你的结构的一个成员是
char MasterKey[3];
当你初始化你做的对象时
//strcpy(NodeArray[i].MasterKey,"MasterKey");
strcpy(NodeArray[i].MasterKey,"Msk"); /* still too large */
对于可用空间来说太多了(!)。