Я пытаюсь выучить CUDA и пытаюсь пройти простую программу.Программа просматривает предварительно заполненный массив, заполненный 0,1,2, а затем подсчитывает количество связанных чисел в общем массиве (т. Е. Сколько 00,01,02,10,11,12,20,21,22комбинаций).К сожалению, кажется, что он считает только 1 из каждого вхождения, а затем останавливается.
Предварительно заполненный массив имеет (0,1,0,2,0,0,2,0,1,0) Ожидаемый результат долженbe (1,2,2,2,2,0,0,2,0,0) Фактический объем производства составляет (1,1,1,1,1,0,0,1,0,0)
int a * - это предварительно заполненный массив, int b * - это «общий» массив комбинаций.
В настоящее время глобальный ядро вызывается с одним блоком из 10 потоков.(Позже я хотел бы изменить это на несколько блоков, но сначала я хотел, чтобы потоки работали).
Есть предложения?
Я пытался поделиться массивом, используя shared и использование __syncthreads, но моя проблема, вероятно, требует чего-то другого.
__device__ int GetIndex(int a, int b) {
if (a == 0 && b == 0) return 0;
if (a == 0 && b == 1) return 1;
if (a == 0 && b == 2) return 2;
if (a == 1 && b == 0) return 3;
if (a == 1 && b == 1) return 4;
if (a == 1 && b == 2) return 5;
if (a == 2 && b == 0) return 6;
if (a == 2 && b == 1) return 7;
if (a == 2 && b == 2) return 8;
}
__global__ void CalculateRecurrences(int *a, int *b) {
__shared__ int s[TOTAL_COMBINATIONS];
int e = threadIdx.x + blockIdx.x * blockDim.x;
for (int i = 0; i < 10; i++)
{
s[i] = b[i];
}
__syncthreads();
if (e < 10) {
int index;
int next = a[e + 1];
printf("%i %i", a[e], next);
index = GetIndex(a[e], next);
s[index] += 1;
}
for (int i = 0; i < 10; i++)
{
b[i] = s[i];
}
__syncthreads();
}
Заранее спасибо.Пожалуйста, дайте мне знать, если мне нужно что-то уточнить.