Как я могу определить, объединен ли этот доступ на запись? - PullRequest
1 голос
/ 22 июня 2011

Как я могу определить, является ли следующий доступ к памяти объединенным или нет:

// Thread-ID
int idx = blockIdx.x * blockDim.x + threadIdx.x;

// Offset:
int offset = gridDim.x * blockDim.x;

while ( idx < NUMELEMENTS )
{
    // Do Something
    // ....

    // Write to Array which contains results of calculations
    results[ idx ] = df2;

    // Next Element
    idx += offset;
}

NUMELEMENTS - полное число отдельных элементов данных для обработки. Массив results передается как указатель на функцию ядра и размещается ранее в глобальной памяти.

Мой вопрос: Объединен ли доступ на запись в строке results[ idx ] = df2;?

Я верю, что каждый поток обрабатывает последовательно проиндексированные элементы, но я не совсем уверен в этом и не знаю, как сказать.

Спасибо!

1 Ответ

2 голосов
/ 22 июня 2011

Зависит от того, является ли длина строк вашей матрицы кратной половине размера основы для устройств с вычислительной способностью 1.x или кратной размеру основы для устройств с вычислительной способностью 2.x.Если это не так, вы можете использовать заполнение, чтобы сделать его полностью объединенным.Для этого можно использовать функцию cudaMallocPitch.

edit: извините за путаницу.Вы пишете «смещенные» элементы за один раз, который я интерпретировал как строки матрицы.

Я имею в виду, что после каждой итерации вашего цикла вы увеличиваете idx на offset.Если смещение кратно половине размера основы для устройств с вычислительной способностью 1.x или кратно размеру основы для устройств с вычислительной возможностью 2.x, то вы объединяетесь, если нет, то для этого нужно заполнение.

Возможно, он уже объединен, потому что вы должны выбрать количество потоков в блоке и, следовательно, blockDim, кратное размеру деформации.

...