Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >__threadfence()和L1缓存一致性

__threadfence()和L1缓存一致性
EN

Stack Overflow用户
提问于 2013-10-25 12:26:05
回答 1查看 1.2K关注 0票数 2

我的理解是(例如,如何在不将指针声明为易失性的情况下强制执行CUDA全局内存一致性?GTS 250与费米器件的库达块同步差异这篇文章位于nvidia开发者区),__threadfence()保证全局写入在线程继续之前对其他线程是可见的。但是,即使在L1返回之后,另一个线程仍然可以从其__threadfence()缓存读取陈旧的值。

这就是:

线程A将一些数据写入全局内存,然后调用__threadfence()。然后,在__threadfence()返回并且所有其他线程都可以看到写入之后的某个时间,线程B被要求从这个内存位置读取。它发现它有L1中的数据,所以会加载这些数据。不幸的是,对于开发人员来说,线程B的L1中的数据已经过时(也就是说,它和线程A更新该数据之前一样)。

首先:这是对的吗?

如果是这样的话,那么在我看来,只有当任何一个人都可以是__threadfence()--数据不会在L1中(有点不太可能?)时,才会有用。或者,如果读取总是绕过L1 (例如易失性或原子)。这是正确的吗?

我之所以这样问,是因为我有一个相对简单的用例--用一个二叉树来传播数据--使用原子设置的标志和__threadfence():到达节点的第一个线程退出,第二个线程根据其两个子节点(例如,数据的最小值)向它写入数据。这对于大多数节点都有效,但通常至少有一个节点失败。声明数据volatile提供了一致的正确结果,但是对于没有从L1获取陈旧值的情况,99%+会导致性能下降。我想确定这是这个算法的唯一解决方案。下面给出了一个简化的例子。注意,节点数组的顺序是宽度优先,叶子从索引start开始,并且已经填充了数据。

代码语言:javascript
运行
AI代码解释
复制
__global__ void propagate_data(volatile Node *nodes,
                               const unsigned int n_nodes,
                               const unsigned int start,
                               unsigned int* flags)
{
    int tid, index, left, right;
    float data;
    bool first_arrival;

    tid = start + threadIdx.x + blockIdx.x*blockDim.x;

    while (tid < n_nodes)
    {
        // We start at a node with a full data section; modify its flag
        // accordingly.
        flags[tid] = 2;

        // Immediately move up the tree.
        index = nodes[tid].parent;
        first_arrival = (atomicAdd(&flags[index], 1) == 0);

        // If we are the second thread to reach this node then process it.
        while (!first_arrival)
        {
            left = nodes[index].left;
            right = nodes[index].right;

            // If Node* nodes is not declared volatile, this occasionally
            // reads a stale value from L1.
            data = min(nodes[left].data, nodes[right].data);

            nodes[index].data = data;

            if (index == 0) {
                // Root node processed, so all nodes processed.
                return;
            }

            // Ensure above global write is visible to all device threads
            // before setting flag for the parent.
            __threadfence();

            index = nodes[index].parent;
            first_arrival = (atomicAdd(&flags[index], 1) == 0);
        }
        tid += blockDim.x*gridDim.x;
    }
    return;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-25 17:28:41

首先,这是对的吗?

是的,__threadfence()将数据推入L2并输出到全局内存中。它对其他短消息中的L1缓存没有影响。

这是正确的吗?

是的,如果将__threadfence()volatile结合用于全局内存访问,您应该相信值最终将在其他线程块中可见。但是,请注意,线程块之间的同步在CUDA中不是一个定义良好的概念。没有明确的机制来这样做,也没有保证线程块执行的顺序,所以仅仅因为您的代码在某个地方有一个__threadfence()volatile项上操作,仍然不能真正保证另一个线程块可能获取哪些数据。这也取决于执行的顺序。

如果使用volatile,则应该绕过L1 (如果启用- 当前的开普勒设备实际上还没有启用L1来进行通用全局访问)。如果不使用volatile,那么当前正在执行__threadfence()操作的SM的L1在完成__threadfence()操作时应该与L2 (和全局)保持一致/一致。

请注意,L2缓存是跨设备统一的,因此始终是“一致的”。对于您的用例,至少从设备代码的角度来看,L2和全局内存之间没有区别,不管您使用的是哪种SM。

正如您所指出的,(全局) atomics总是在L2/全局内存上运行。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19598852

复制
相关文章
message 弹出窗口
import  javax.swing.JOptionPane; public class gong {     public static void main(String [] args) {  
Gxjun
2018/03/22
4.6K0
message 弹出窗口
弹出窗口大全
【1、最基本的弹出窗口代码】 其实代码非常简单:  window.open(page.htmJavaScript
Java架构师必看
2021/03/22
4.5K0
Flex 弹出窗口的例子
<?xml version="1.0" encoding="utf-8"?> <mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml"   l
用户3135539
2018/09/12
3.5K0
赞!idea 如何单窗口打开多个项目?
我的笔记本连接了2块显示器,加上自带的那块,一共是3块。即使是这样,但依然不够用。没别的原因,每天都在无数个项目中切换,IDEA的窗口开的多,就把它平铺在桌面上。
xjjdog
2022/09/26
4.4K0
jQuery的弹出窗口插件colorbox
支持 照片,照片组,幻灯片,ajax,内联 和 iframe 框架。 通过CSS 控制外观,使用用户可以很容易重新定制外观。 不需要更改 ColorBox 的 javascript 文件就可以重新设定其行为。 可以依靠 callback & event-hooks 进行拓展,不需要修改源代码。 非常友好,不需要修改现有的 HTML,所有的选项都通过 JS 设置。
全栈程序员站长
2021/12/23
5.8K0
如何一下删除多个文件
按WIN键+R,输入CMD,打开命令提示符. 到你要删的目录上.例如E盘Program Files目录的文件 e: 进入E盘 cd Program Files del *.exe /S /F 删除子目录下所有的.exe文件 rd abc /S 删除abc目录,包括里面的所有目录和文件
周小董
2019/03/25
1.5K0
selenium多个窗口切换
浏览器里面支持多窗口打开,例如这样: html里面写了: target="_blank" 造成新打开一个窗口,但是selenium不会自动跳转到新的串口,需要自己切换: # 你打开的浏览器,谷歌
机器学习和大数据挖掘
2019/07/02
2.3K0
jquery 模态窗口 弹出窗 simpleModal
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>SimpleModal Basic Modal Dialog </title> <link type='text/css' href='css/demo.css' rel='stylesheet' /> <link type='text/css' href='css/box.css' rel='stylesheet' /> </head> <body> <div id='container'>
用户5760343
2019/10/10
6.6K0
jquery 模态窗口 弹出窗 simpleModal
10.14 如何实现一个居中弹出的窗口?
如何实现一个居中弹出的窗口? 效果 代码 <h1>如何实现一个居中弹出的窗口?</h1> <div id="panel1" class="panel-mask"> <div class="panel"> <style> .panel-mask { height: 100%; position: fixed;
LIYI
2020/10/26
1.7K0
10.14 如何实现一个居中弹出的窗口?
SAP ABAP 弹窗弹出多个message
普通消息输出方式每次只能输出最后一条消息,例如: message e001(vf).
matinal
2023/10/13
3910
Silverlight中多个Xaml("场景"? or "窗口"? )之间的切换/调用/弹出/传参数问题小结
silverlight中不存在Flash中的场景,有的只是一个个Xaml文件,你要是愿意,也可以把它看做"场景"或"窗口",刚开始接触sl时,对于多个xaml之间如何切换,调用,传递参数感到很棘手,下面是我总结的几种方法: 1、A.xaml跳转到B.xaml (a)首先需要定义一个公用的接口(interface),如下: using System.Windows; namespace ChildWin.Code {     public interface IContent     {         UI
菩提树下的杨过
2018/01/23
2.1K0
Silverlight Telerik控件学习:弹出窗口RadWindow
几乎所有的业务系统都有弹出窗口,典型场景有二种 : 1、简单的弹出一个对话框显示信息,比如下面这样: 这个很简单,代码示例如下: DialogParameters pars = new DialogP
菩提树下的杨过
2018/01/23
3.8K0
Silverlight Telerik控件学习:弹出窗口RadWindow
WPF 解决弹出模态窗口关闭后,主窗口不在最前
本文告诉大家如何解决这个问题,在 WPF 的软件,弹出一个模态窗口。使用另一个窗口在模态窗口前面。从任务栏打开模态窗口。关闭模态窗口。这时发现,主窗口会在刚才使用的另一个窗口下面。
林德熙
2018/09/18
15.2K2
如何在WordPress网站中添加Cookie弹出窗口(不使用插件)
如果你是使用WordPress建站的用户,那么有可能你的网站已经在使用Cookie来收集访问者的数据,如果您没有在网站上显示任何同意Cookie的通知,您可能会被处以巨额罚款或可能不得不处理严重的问题。
晓得博客
2021/07/23
4.5K0
WPF 解决弹出模态窗口关闭后,主窗口不在最前
本文告诉大家如何解决这个问题,在 WPF 的软件,弹出一个模态窗口。使用另一个窗口在模态窗口前面。从任务栏打开模态窗口。关闭模态窗口。这时发现,主窗口会在刚才使用的另一个窗口下面。
林德熙
2019/03/13
5.6K0
让Safari不再弹出新窗口
一直很喜欢Firefox点击页面中带有target=“_blank”链接的时候,不是新开窗口,而是打开一个新的标签。
EltonZheng
2021/01/26
3.7K0
显示为弹出窗口是什么意思(电脑总是弹出广告)
快快赶紧的把我的指甲刀那来,谁都不要拦我~~~~~~~~~~~~~~~~~~~~~~~~
全栈程序员站长
2022/08/01
3.9K0
显示为弹出窗口是什么意思(电脑总是弹出广告)
WPF 已知问题 全屏透明窗口弹出子窗口会闪烁
在 WPF 中通过设置 WindowStyle 为 None 以及 WindowState 为 Maximized 进入全屏,同时设置 AllowsTransparency 支持透明,此时弹出一个设置 WindowStyle 是 None 的子窗口,用 VisualStudio 2019 运行将会看到 子窗口 先显示出来,然后回到主窗口下面,然后再显示到主窗口上面
林德熙
2020/03/23
4.3K0
WPF 解决弹出模态窗口关闭后,主窗口不在最前
本文告诉大家如何解决这个问题,在 WPF 的软件,弹出一个模态窗口。使用另一个窗口在模态窗口前面。从任务栏打开模态窗口。关闭模态窗口。这时发现,主窗口会在刚才使用的另一个窗口下面。
林德熙
2022/08/04
6.1K0
点击加载更多

相似问题

Openlayer:删除多个弹出窗口

20

如何删除弹出窗口?

127

jquery弹出窗口-多个弹出窗口

10

在弹出窗口上删除弹出窗口

11

删除弹出窗口

21
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档