Cuda 共享内存指针算法
我不明白下面几行到底发生了什么:Cuda 共享内存指针算法,cuda,Cuda,我不明白下面几行到底发生了什么: unsigned char*membershipChanged=(unsigned char*)sharedMemory和 float*集群=(float*)(sharedMemory+blockDim.x) 我假设在#1sharedMemory中有效地重命名为membershipChanged,但是为什么要将blockDim添加到sharedMemory指针。这个地址指向哪里 sharedMemory是使用extern\uuuuuuuuuuuuuuuu共享\u
unsigned char*membershipChanged=(unsigned char*)sharedMemory代码>和
float*集群=(float*)(sharedMemory+blockDim.x)代码>
sharedMemory
中有效地重命名为membershipChanged
,但是为什么要将blockDim
添加到sharedMemory
指针。这个地址指向哪里
sharedMemory
是使用extern\uuuuuuuuuuuuuuuu共享\uuuuuuuuuuuuuu字符sharedMemory[]创建的代码>
我在文件中找到的代码
void查找最近的集群(int numCoords,
int numObjs,
int numClusters,
浮动*对象,//[numCoords][numObjs]
浮动*设备群集,//[numCoords][numClusters]
int*成员身份,//[numObjs]
int*中间产物)
{
外部共享字符共享内存[];
//为membershipChanged选择的类型必须足够大,以支持
//减少!有blockDim.x元素,在
//街区。
unsigned char*membershipChanged=(unsigned char*)sharedMemory;
float*集群=(float*)(sharedMemory+blockDim.x);
成员身份更改[threadIdx.x]=0;
//当心:如果共享内存太多,我们可能会溢出共享内存
//群集或坐标太多!
对于(int i=threadIdx.x;i
sharedMemory+blockDim.x
指向距共享内存区域底部的blockDim.x
字节
您可能会这样做的原因是在共享内存中进行子分配。内核的启动站点(包括find\u nearest\u cluster
动态地为内核分配一定量的共享存储。该代码意味着两个逻辑上不同的数组驻留在sharedMemory--成员身份已更改
,并且群集
。指针算法只是获取指向第二个数组的指针的一种方法。sharedMemory+blockDim.x
指向距共享内存区域底部的blockDim.x
字节
您可能会这样做的原因是在共享内存中进行子分配。内核的启动站点(包括find\u nearest\u cluster
动态地为内核分配一定量的共享存储。该代码意味着两个逻辑上不同的数组驻留在sharedMemory--成员身份已更改
,群集
。指针算法只是获取指向第二个数组的指针的一种方法。和外部共享字符共享内存[]
足以告诉cuda分配所有可用的共享内存吗?否。共享内存在内核启动时使用以下语法动态分配:kernel(args…)。指向动态分配的smem的指针位于extern shared变量处。和extern\uuuuu shared\uuuuuuuuuu char sharedMemory[]
是否足以告诉cuda分配所有可用的共享内存?否。共享内存在内核启动时使用以下语法动态分配:kernel(args…)。指向动态分配的smem的指针位于extern shared变量处。
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];
}
}
.....