2014-09-22 2 views
-1

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

+0

У меня есть серийная версия моего кода, которые приводят к равным результатам для некоторого ввода M только с 1 'numOfBlocks'. Если я использую другой вход M 'с 2' numOfBlocks ', результат отличается от моего серийного кода. – Burak

+3

Не могли бы вы предоставить минимальный размер, полный регенератор вашей проблемы? Без этого было бы невозможно ответить на ваш вопрос. – JackOLantern

ответ

1

Я работал целый день на этом, и я наконец нашел решение. Во-первых, вы правы, что у меня в DeviceFunc() много угроз RAW. Я начал поместить некоторые __syncthreads() после любой операции WRITE, но я думаю, что это замедляет мою программу. И я не думаю, что __syncthreads() - это общий способ их решения. Смешно, что результат все тот же с и без __syncthreads().

Но моя проблема в моем коде выше, что я использовал

input[t] 

, который был не прав, потому что я должен был включать в себя «numOfBlocks» в моем расчете индекса:

input[(NUM_OF_XOR_THREADS * i) + t) 

Теперь, результат был правильным, и моя проблема решена.

Смежные вопросы