проблема cuPrintf - PullRequest
       16

проблема cuPrintf

4 голосов
/ 02 июля 2011

Я пытаюсь скопировать массив структуры на устройство. Я работаю с одним атм графического процессора, и у меня возникла проблема с функцией 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

Ответы [ 3 ]

7 голосов
/ 06 июля 2011

Просмотрите документацию cuPrintf (файл readme находится по адресу C / src / simplePrintf / doc / cuPrintf_readme.htm из базового каталога, в который вы установили SDK):

Существуют ограничения / известные проблемы использования 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 требует, чтобы приложения создавались с использованием API времени выполнения CUDA

В вашем случае вы не используете const char* аргументов.

1 голос
/ 05 июля 2011

Один из членов вашей структуры -

    char MasterKey[3];

, и когда вы инициализируете объекты, вы делаете

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

, что немного (!) Слишком много для доступного пространства.

1 голос
/ 03 июля 2011

В вашем последнем обновлении вам нужно увеличить slenz на sizeof(char) <- при копировании. Так и должно быть: </p>

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