- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下“Frankenstein”和减少代码,部分来自 common CUDA reduction slices ,部分来自 CUDA 示例。
__global__ void reduce6(float *g_idata, float *g_odata, unsigned int n)
{
extern __shared__ float sdata[];
// perform first level of reduction,
// reading from global memory, writing to shared memory
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*blockSize*2 + threadIdx.x;
unsigned int gridSize = blockSize*2*gridDim.x;
sdata[tid] = 0;
float mySum = 0;
while (i < n) {
sdata[tid] += g_idata[i] + g_idata[i+MAXTREADS];
i += gridSize;
}
__syncthreads();
// do reduction in shared mem
if (tid < 256)
sdata[tid] += sdata[tid + 256];
__syncthreads();
if (tid < 128)
sdata[tid] += sdata[tid + 128];
__syncthreads();
if (tid < 64)
sdata[tid] += sdata[tid + 64];
__syncthreads();
#if (__CUDA_ARCH__ >= 300 )
if ( tid < 32 )
{
// Fetch final intermediate sum from 2nd warp
mySum = sdata[tid]+ sdata[tid + 32];
// Reduce final warp using shuffle
for (int offset = warpSize/2; offset > 0; offset /= 2)
mySum += __shfl_down(mySum, offset);
}
sdata[0]=mySum;
#else
// fully unroll reduction within a single warp
if (tid < 32) {
sdata[tid] += sdata[tid + 32];
sdata[tid] += sdata[tid + 16];
sdata[tid] += sdata[tid + 8];
sdata[tid] += sdata[tid + 4];
sdata[tid] += sdata[tid + 2];
sdata[tid] += sdata[tid + 1];
}
#endif
// write result for this block to global mem
if (tid == 0) g_odata[blockIdx.x] = sdata[0];
}
我将使用它来减少 Tesla k40 GPU 上展开的大尺寸数组(例如 512^3 = 134217728 = n
)。
我对 blockSize
变量及其值有一些疑问。
从这里开始,我将尝试解释我对它是如何工作的理解(无论是对还是错):
我选择的 blockSize
越大,这段代码执行得越快,因为它在整个循环中花费的时间更少,但它不会完成整个数组的减少,但会返回一个更小的大小为 dimBlock.x
的数组,对吗?如果我使用 blockSize=1
,此代码将在 1 调用缩减值时返回,但它会非常慢,因为它几乎没有利用 CUDA 的功能。因此,我需要多次调用缩减内核,每次都使用较小的 blokSize
,并减少之前调用 reduce 的结果,直到我到达最小点。
类似(伪代码)
blocks=number; //where do we start? why?
while(not the min){
dim3 dimBlock( blocks );
dim3 dimGrid(n/dimBlock.x);
int smemSize = dimBlock.x * sizeof(float);
reduce6<<<dimGrid, dimBlock, smemSize>>>(in, out, n);
in=out;
n=dimGrid.x;
dimGrid.x=n/dimBlock.x; // is this right? Should I also change dimBlock?
}
我应该从哪个值开始?我想这取决于 GPU。 Tesla k40 应该是哪个值(只是为了让我了解如何选择这些值)?
我的逻辑有问题吗?怎么办?
最佳答案
有一个 CUDA 工具可以为您获得良好的网格和 block 大小:Cuda Occupancy API .
响应 “我选择的 blockSize 越大,这段代码执行得越快” -- 不一定,因为你想要最大 occupancy 的大小(事件扭曲与可能事件扭曲总数的比率)。
有关更多信息,请参阅此答案 How do I choose grid and block dimensions for CUDA kernels? .
最后,对于支持 Kelper 或更高版本的 Nvidia GPU,有 shuffle intrinsics使减少更容易和更快。这是一篇关于如何使用随机播放内在函数的文章:Faster Parallel Reductions on Kepler .
选择线程数的更新:
如果使用最大线程数会降低寄存器的使用效率,您可能不想使用它。来自入住链接:
为了计算占用率,每个线程使用的寄存器数量是关键因素之一。例如,计算能力为 1.1 的设备每个多处理器有 8,192 个 32 位寄存器,最多可以同时驻留 768 个线程(24 个线程 x 每个线程 32 个线程)。这意味着在其中一个设备中,要使多处理器拥有 100% 的占用率,每个线程最多可以使用 10 个寄存器。然而,这种确定寄存器计数如何影响占用率的方法没有考虑寄存器分配粒度。例如,在计算能力为 1.1 的设备上,具有 128 线程 block 的内核每个线程使用 12 个寄存器导致占用率为 83%,每个多处理器有 5 个事件的 128 线程 block ,而具有 256 线程 block 的内核每个线程使用相同的 12 个寄存器会导致占用率为 66%,因为在一个多处理器上只能驻留两个 256 线程 block 。
所以我的理解是,由于寄存器的分配方式,增加线程数可能会限制性能。然而,情况并非总是如此,您需要自己进行计算(如上述语句)以确定每个 block 的最佳线程数。
关于c++ - CUDA 缩减,大阵列的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35039902/
我目前正在学习使用 C 和 OpenMP 进行并行编程。 我想编写简单的代码,其中两个共享值由多个线程递增。 首先我使用了减少指令,它按预期工作。然后我改用 关键 启动关键部分的指令 - 它也有效。
我在用 kubectl scale --replicas=0 -f deployment.yaml 停止我所有正在运行的 pod 。请让我知道是否有更好的方法将所有正在运行的 pod 降到零,保持配置
请考虑我从教程中获得的以下代码和随附的解释性图像。其目的是演示 CUDA 的并行缩减。 #include "cuda_runtime.h" #include "device_launch_parame
我有以下“Frankenstein”和减少代码,部分来自 common CUDA reduction slices ,部分来自 CUDA 示例。 __global__ void reduce
学习openMP // array b #pragma omp parallel for // reduction(&&: b[i])? for (i=2; i<=N; i++
我目前正在使用以下 Reduction 函数通过 CUDA 对数组中的所有元素求和: __global__ void reduceSum(int *input, int *input2, int *i
假设我有两个 numpy 数组,形状为 (d, f) 的 A 和形状为 (d,) 的 I 包含 0..n 中的索引,例如 I = np.array([0, 0, 1, 0, 2, 1]) A = np
我有一个例程,它使用一个循环来计算给定下方粒子表面的粒子的最小高度。此例程尝试随机位置并计算最小高度,然后返回 x, y, z 值,其中 z 是找到的最小高度。 此例程可以与omp parallel
每个视频都有一个有趣的时刻集合,每个时刻代表一个截屏有趣的时间或代表整个标题的时间。请注意,boxarts 和 interestingMoments 数组都位于树中的相同深度。使用 Array.zip
我有一个 ImageIcon,用作打开此 skillsFrame 的按钮。此图像大小为 100x100 像素。正如您在屏幕截图中看到的那样,如果我只是放置图像,它太大了(这是预期的)。 我的问题是关于
我的任务是从 [[a]] 矩阵中获取一列。 一个简单的解决方案是 colFields :: Int -> [[a]] -> [a] colFields n c = map (!! n) c 当减少一级
问题是:如果我输入 hadoop jar MY.jar name_my_class /用户/用户/输入/用户/用户/输出 我需要的所有类都在MY.jar中,为什么我仍然收到错误 java.lang.N
我正在尝试使用 Nodejs、mongoose 和 MongoDB 来进行映射缩减操作。我有一个相当平坦的模式结构,我想获取每个“命名”对象的值/日期对列表。 map 缩减功能显然有问题,但我不知道如
我在 DigitalOcean 中设置了一个 Kubernetes 集群。集群配置为使用 HPA(Horizontal Pod Autoscaler)自动扩展。我想防止终止在过去 1 小时内按比例
IBM Cloudant NoSQL 对每秒的查找、写入、查询有一些限制。 在CloudAnt上我可以编写一个DesignDocument“View”。 当我读取一个 View 时,该读取会对哪里产生
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
我最近刚刚开始使用 Python 编码,还有很多东西需要学习。我的代码的目标是从单元格中提取字符串,检查其字符长度并用特定缩写替换单词。然后,我将新字符串写入另一个 Excel 工作表中,并在所有数据
我有一个以下形式的 map : Map> START 让 INNER 成为内部映射,即 Map 例如,我想在新 map 中缩小 START map Map END 它们具有相同的键,但具有不同的值。特
给定以下 lambda 表达式,其中 \ 类似于 lambda: (\kf.f(\c.co)km)(\x.dox)(\le.le) 如果我将(\c.co)k转换成ko是不是错了?我这样做了,显然,这是
从 OpenMP 4.0 开始,支持用户定义的缩减。所以我在 C++ 中完全从 here 定义了对 std::vector 的归约。 .它适用于 GNU/5.4.0 和 GNU/6.4.0,但它返回随
我是一名优秀的程序员,十分优秀!