cuPrintf问题

mev*_*eva 4 c cuda gpu

我正在尝试将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;
 };
Run Code Online (Sandbox Code Playgroud)

为了测试目的,我填充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;
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的主要功能如下:

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);
}
Run Code Online (Sandbox Code Playgroud)

如果我写测试功能如下:

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

    }   
    return;
}
Run Code Online (Sandbox Code Playgroud)

我得到这样的输出:

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]: ì?!
Run Code Online (Sandbox Code Playgroud)

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

__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;
}
Run Code Online (Sandbox Code Playgroud)

然后我得到正确的输出:

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
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

给出输出:

    [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
Run Code Online (Sandbox Code Playgroud)

jop*_*rat 7

查看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*参数.