Как заменить функцию CUDA на однопоточные функции процессора? - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь отладить свою программу cuda, но я выгляжу очень непрактичным для меня, потому что она многопоточная, так как вам нужно выбрать основы, а также иметь два отладчика, если вы хотите отлаживать одновременно и cpu, и gpu время. Также я искал однопоточный режим отладки, но его, похоже, не существует, тогда я решил изменить функции, когда я нахожусь в конфигурации отладки, добавив #ifdef _DEBUG строк. Вот так:

#ifndef DEBUG
__global__
#endif
void add(int n, float *x, float *y)
{
  int index = threadIdx.x;
  int stride = blockDim.x;
  for (int i = index; i < n; i += stride)
      y[i] = x[i] + y[i];
}

И:

int blockSize = 256;
int numBlocks = (N + blockSize - 1) / blockSize;
ifdef _DEBUG
        gridDim.x = numBlocks;
        blockDim.x = blockSize;
        for (threadIdx.x = 0; threadIdx.x < blockSize; threadIdx.x++)
            for (blockIdx.x = 0; blockIdx.x < numBlocks; blockIdx.x++)
                add(N, x, y);
#else
        add<<<numBlocks, blockSize>>>(N, x, y);
        cudaDeviceSynchronize();
#endif // _DEBUG

Это может работать, но компилятор жалуется на то, что gridDim.x, blockDim.x, threadIdx.x и blockIdx.x недоступны для редактирования.

Я пробовал это:

#ifdef _DEBUG

    #define __global__
    uint3 threadIdx;
    uint3 blockIdx;
    uint3 blockDim;
    uint3 gridDim;

#else

    #include "cuda_runtime.h"
    #include "device_launch_parameters.h"

#endif

Но это больше не нравится, давая declaration is incompatible with "const uint3 threadIdx". Мои знания C ++ недостаточно расширены, чтобы найти решение.

РЕДАКТИРОВАТЬ: я мог бы изменить все свои ядра следующим образом:

void add(int n, float *x, float *y)
{
  #ifdef _DEBUG
     int index=mythreadidxx;
     int stride=myblockdimx;
  #else
     int index = threadIdx.x;
     int stride = blockDim.x;
  #endif

  for (int i = index; i < n; i += stride)
      y[i] = x[i] + y[i];
}

Но это снова сделало бы код тяжелее.

Ответы [ 2 ]

1 голос
/ 29 января 2020

Есть несколько приличных отладчиков cuda, которые могут отлаживать cpu и gpu одновременно, в частности, вы можете использовать инструменты Nvidia, такие как Cuda-gdb , которые можно использовать в визуальном исследовании ios или затмение для контрольных точек процессора и графического процессора. Также платятся за такие инструменты, как общий вид или Arm-ddt .

0 голосов
/ 30 января 2020

Наконец-то я нашел решение и добавил, что в начале:

#ifdef STHREADED

    #define __global__
    int threadIdxX;
    int blockIdxX;
    int blockDimX;
    int gridDimX;

#else

    #include "cuda_runtime.h"
    #include "device_launch_parameters.h"

    #define threadIdxX threadIdx.x
    #define blockIdxX blockIdx.x
    #define blockDimX blockDim.x
    #define gridDimX gridDim.x

#endif

Таким образом, в моем коде я могу использовать threadIdxX вместо threadIdx.x, и я смог найти ошибку, которую я искал без использования потоков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...