Я новичок в программировании CUDA и странное поведение.Будут ли другие потоки блокироваться в этом коде с CUDA?
У меня есть ядро так:
__global__ void myKernel (uint64_t *input, int numOfBlocks, uint64_t *state) {
int const t = blockIdx.x * blockDim.x + threadIdx.x;
int i;
for (i = 0; i < numOfBlocks; i++) {
if (t < 32) {
if (t < 8) {
state[t] = state[t]^input[t];
}
if (t < 25) {
deviceFunc(device_state); /* will use some printf() */
}
}
}
}
я бегу это ядро с этим параметром: MYKERNEL < < < 1, 32 >>> (вход, numOfBlocks, состояние);
Если «numOfBlocks» равно 1, он будет работать нормально, я получаю результат, который я ожидаю, и printf() внутри deviceFunc() находятся в правильном порядке.
Если «numOfBlocks» равно 2, это не работает нормально! Результат не в том, что я ожидал, и printf() не в правильном порядке (я использую только printf() из потока 0)!
Итак, теперь мой вопрос: Левые темы из (32-25), которые НЕ вызывают deviceFunc(), будут ли они ждать и блокировать эту позицию, или они будут запускать снова и начать с следующего for- циклическая итерация? Я всегда думал, что каждая строка в ядре синхронизируется в одном блоке.
У меня есть серийная версия моего кода, которые приводят к равным результатам для некоторого ввода M только с 1 'numOfBlocks'. Если я использую другой вход M 'с 2' numOfBlocks ', результат отличается от моего серийного кода. – Burak
Не могли бы вы предоставить минимальный размер, полный регенератор вашей проблемы? Без этого было бы невозможно ответить на ваш вопрос. – JackOLantern