如何在无分支分歧的情况下检查CUDA内核中数组的边界

泰泰成

在以下内核中,我使用了if语句来避免超出范围的计算。但是,如果我理解正确,那么“ if”语句将导致分支发散,这会减慢计算速度-如果我在这里错了,请纠正我。

我的问题:在内核中进行超出范围的计算时,如何避免使用if语句?

__global__ void vector_add(float *a, float *b, float *c)
{
    int index = blockIdx.x * blockDim.x + threadIdx.x;
    if(index < N)
          c[index] = a[index]*a[index] + b[index]*b[index];
}
//kernel call here
vector_add<<< (N + (THREADS_PER_BLOCK+1)) / THREADS_PER_BLOCK, THREADS_PER_BLOCK >>>( d_a, d_b, d_c );
用户名

从技术上讲,它被称为“发散”(因为并非经纱中的所有线程都相同地评估条件),但这是完全无害的。

不评估谓词的线程true将被禁用:这不是性能问题,因为无论如何这些线程都不希望参与计算。您不会丢失任何实际的工作线程N符合1 mod 32(或任何经线大小)的病理情况下,存在几乎完全“浪费”的经线,但这又不是性能问题。

当warp中的线程采用需要串行执行的不同路径时,warp分歧会损害您的性能。这里不是这种情况。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何处理这个git警告?“不建议在不指定如何协调分歧分支的情况下进行拉动”

如何在不轮询内核的情况下在C程序中监视NIC状态(上/下)?

如何在不循环的情况下获取多维数组中特定“键”的数组

如何在Espresso中没有实际启动活动的情况下检查发送的预期意图?

如何在不关闭Gitlab中的问题的情况下合并分支?

如何在不使用联接的情况下检查Liquid数组(Shopify)中元素的存在

如何在不使用for循环或任何数组方法的情况下检查数组中是否存在元素

如何在不切换分支的情况下检查另一个分支中是否有新的提交?

如何在不阻塞的情况下检查Java中是否存在文件?

如何在没有在分支上创建分支的情况下从分支创建拉取请求?

如何在不覆盖分支更新的情况下从master同步git分支?

如何在启用CUDA的情况下安装Pytorch 1.3.1

Bitbucket:如何在不复制Master分支的情况下创建新分支

在仅知道索引的情况下,如何在一个段落中获得单词的边界矩形?

如何在tensorflow中不生成警告的情况下检查是否存在GPU

如何在不删除git中的clidl的情况下更新父分支?

如何在不使用xpath的情况下检查元素

如何在Linux中不使用ping的情况下检查wifi连接?

如何在不重新启动的情况下查看ubuntu中的grub内核

如何在不破坏DRY原理的情况下从接口检查方法中的参数

如何在不看主板的情况下检查RAM大小

如何在不引起OS内核崩溃的情况下修改内核参数

如何在不嵌套查找的情况下更新(“检查”)jquery中的特定复选框?

如何在不影响当前分支的情况下Git拉到新分支?

如何在不使用isdigit的情况下检查数字是否不是C中的整数?

如何在没有文档的情况下检查 api?

如何在不迭代数组的情况下提取对象数组中特定键的值?

如何在不遍历数组的情况下对数组中的每个元素调用方法?

如何在不迭代的情况下从查询中检查 ActiveRecord 是否存在?

TOP 榜单

热门标签

归档