Арифметика указателей с общей памятью - PullRequest
1 голос
/ 27 сентября 2011

Я не понимаю, что именно происходит в следующих строках:

  1. unsigned char *membershipChanged = (unsigned char *)sharedMemory; и

  2. float *clusters = (float *)(sharedMemory + blockDim.x);

Я предполагаю, что в # 1 sharedMemory фактически переименовано в membershipChanged, но зачем вам добавлять blockDim к указателю sharedMemory.Где находится этот адрес?

sharedMemory был создан с extern __shared__ char sharedMemory[];


Код, который я нашел в реализации CUDA kmeans .

void find_nearest_cluster(int numCoords,
                          int numObjs,
                          int numClusters,
                          float *objects,           //  [numCoords][numObjs]
                          float *deviceClusters,    //  [numCoords][numClusters]
                          int *membership,          //  [numObjs]
                          int *intermediates)
{
extern __shared__ char sharedMemory[];

//  The type chosen for membershipChanged must be large enough to support
//  reductions! There are blockDim.x elements, one for each thread in the
//  block.
unsigned char *membershipChanged = (unsigned char *)sharedMemory;
float *clusters = (float *)(sharedMemory + blockDim.x);

membershipChanged[threadIdx.x] = 0;

//  BEWARE: We can overrun our shared memory here if there are too many
//  clusters or too many coordinates!
for (int i = threadIdx.x; i < numClusters; i += blockDim.x) {
    for (int j = 0; j < numCoords; j++) {
        clusters[numClusters * j + i] = deviceClusters[numClusters * j + i];
    }
}
.....

1 Ответ

4 голосов
/ 27 сентября 2011

sharedMemory + blockDim.x указывает blockDim.x байтов от основания области общей памяти.

Причина, по которой вы могли бы сделать что-то подобное, состоит в том, чтобы перераспределить в общей памяти.Сайт запуска ядра, который включает find_nearest_cluster, динамически выделяет некоторое количество общего хранилища для ядра.Код подразумевает, что в общем хранилище находятся два логически разных массива, на которые указывают sharedMemory - membershipChanged и clusters.Арифметика с указателями - это просто средство для получения указателя на второй массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...