如何在无分支分歧的情况下检查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中是否存在文件?

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

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

如何在python中没有regex的情况下检查字符串的要求?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如何在不多次调用 .getJSONObject(key) 的情况下检查 JSONObject 中是否存在属性?

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

如何在不循环 Mustache JS 的情况下检查数组?