我 tr 分配一个 cuda 全局内存数组。我的求和内核为:
__device__ float R_d = 0;
__global__ void perform_summation(float* A, int N){
int idx = blockDim.x*blockIdx.x+threadIdx.x;
extern __shared__ float sharedArray [];
float result[]; //THIS IS THE THING i TRIED TO CREATE
if(idx < N){
sharedArray[threadIdx.x] = A[idx];
// }else{
// sharedArray[threadIdx.x] = 0 ;
// }
for (unsigned int stride = 1; stride < blockDim.x; stride *= 2) {
__syncthreads();
if(threadIdx.x % (2*stride) == 0){
sharedArray[threadIdx.x]+=sharedArray[threadIdx.x+stride];
}
}
}
if(idx % blockDim.x == 0){
// R_d += sharedArray[threadIdx.x];
result[blockIdx.x] = sharedArray[threadIdx.x];
}
for (int i = 0; i < gridDim.x; ++i) {
R_d += result[i];
}
}
作为总结,y内核采用一个数组并通过map reduce方法找到元素的总和。每个块将相关元素放入共享内存并将其中的所有数据相加,然后将结果放入我尝试创建的全局数组中。最后,我会将全局数组的所有数字相加,以找到最后的答案。
作为第一种方法,我没有使用全局数组来收集每个块的结果,我只是将块的结果汇总到变量中R_d
,但它不起作用并且只显示来自最后一个块的值作为结果。我想因为我没有同步。块之间最后一个块覆盖最后的所有值。这是我在内核末尾第一次尝试时所做的
f(idx < N){
sharedArray[threadIdx.x] = A[idx];
// }else{
// sharedArray[threadIdx.x] = 0 ;
// }
for (unsigned int stride = 1; stride < blockDim.x; stride *= 2) {
__syncthreads();
if(threadIdx.x % (2*stride) == 0){
sharedArray[threadIdx.x]+=sharedArray[threadIdx.x+stride];
}
}
if(threadIdx.x == 0){
R_d += sharedArray[threadIdx.x];
}
}
所以我实际上有两个问题。如何为我提出的第一个解决方案在设备内存中定义一个全局内存数组,对于仅使用该R_d
变量的第二个解决方案是否有任何解决方案?