Я не понимаю, что именно происходит в следующих строках:
unsigned char *membershipChanged = (unsigned char *)sharedMemory;
и
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];
}
}
.....