Я пытаюсь отладить свою программу 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];
}
Но это снова сделало бы код тяжелее.