Я пишу ядро CUDA для создания ковариационной матрицы 3x3 для каждого местоположения в основной матрице строк * столбцов.Таким образом, эта трехмерная матрица имеет размер строк * cols * 9, которые я выделил в одном malloc соответственно.Мне нужно получить доступ к этому в одном значении индекса
, 9 значений ковариационной матрицы 3x3 получают свои значения, установленные в соответствии с соответствующей строкой r и столбцом c из некоторых других двумерных массивов.
Другими словами - мне нужно рассчитать соответствующий индекс для доступа к 9 элементам ковариационной матрицы 3x3, а также к смещению строк и столбцов 2D-матриц, которые являются входными данными для значения, а такжесоответствующий индекс для массива хранения.
Я попытался упростить его до следующего:
//I am calling this kernel with 1D blocks who are 512 cols x 1row. TILE_WIDTH=512
int bx = blockIdx.x;
int by = blockIdx.y;
int tx = threadIdx.x;
int ty = threadIdx.y;
int r = by + ty;
int c = bx*TILE_WIDTH + tx;
int offset = r*cols+c;
int ndx = r*cols*rows + c*cols;
if((r < rows) && (c < cols)){ //this IF statement is trying to avoid the case where a threadblock went bigger than my original array..not sure if correct
d_cov[ndx + 0] = otherArray[offset];//otherArray just contains a value that I might do some operations on to set each of the ndx0-ndx9 values in d_cov
d_cov[ndx + 1] = otherArray[offset];
d_cov[ndx + 2] = otherArray[offset];
d_cov[ndx + 3] = otherArray[offset];
d_cov[ndx + 4] = otherArray[offset];
d_cov[ndx + 5] = otherArray[offset];
d_cov[ndx + 6] = otherArray[offset];
d_cov[ndx + 7] = otherArray[offset];
d_cov[ndx + 8] = otherArray[offset];
}
Когда я проверяю этот массив со значениями, рассчитанными на ЦП, который зацикливается наi = строки, j = столбцы, k = 1..9
Результаты не совпадают.
другими словами d_cov [i * row * cols + j * cols + k]! = correctAnswer [i] [j] [k]
Может кто-нибудь дать мне какие-нибудь советы о том, как решить эту проблему?Это проблема индексации или какая-то другая логическая ошибка?