C 铜印问题

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

我正在尝试将一个结构数组复制到设备。我正在使用一个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;
 };
__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的限制如下:

  • 缓冲区大小向上舍入到最接近的256倍
  • 与“%s”字符串格式说明符关联的参数必须为 类型(常量字符*)
  • 要打印(const char*)指针的值,必须首先 已转换为(char*)。全部(常量字符) *)参数被解释为字符串
  • 非零返回代码与标准C printf()不匹配
  • 无法异步输出printf缓冲区(即在内核运行时) (正在运行)
  • 调用cudaPrintfDisplay会隐式发出 cudaDeviceSynchronize()
  • cuPrintfRestrict应用的限制在 发射。将这些从 东道主方面,你必须打电话 cudaPrintfEnd()然后是cudaPrintfInit() 再次
  • 如果将多个模块加载到一个系统中,则cuPrintf输出未定义 单一上下文
  • 尽可能使用“-arch=sm_11”或更高版本进行编译。缓冲区的使用是 更有效的方法是使用寄存器 降低
  • 支持的格式说明符是:“cdiouxXeEfgGaAs”
  • 格式说明符的行为,特别是对正/大小 说明符依赖于主机 printf的机器实现
  • cuPrintf要求使用CUDA运行时API构建应用程序

  • 在您的情况下,您没有使用
    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 */