- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图了解整个 L1/L2 冲洗是如何工作的。假设我有一个像这样的计算着色器
layout(std430, set = 0, binding = 2) buffer Particles{
Particle particles[];
};
layout(std430, set = 0, binding = 4) buffer Constraints{
Constraint constraints[];
};
void main(){
const uint gID = gl_GlobalInvocationID.x;
for (int pass=0;pass<GAUSS_SEIDEL_PASSES;pass++){
// first query the constraint, which contains particle_id_1 and particle_id_1
const Constraint c = constraints[gID*GAUSS_SEIDEL_PASSES+pass];
// read newest positions
vec3 position1 = particles[c.particle_id_1].position;
vec3 position2 = particles[c.particle_id_2].position;
// modify position1 and position2
position1 += something;
position2 -= something;
// update positions
particles[c.particle_id_1].position = position1;
particles[c.particle_id_2].position = position2;
// in the next iteration, different constraints may use the updated positions
}
}
据我了解,最初所有数据都驻留在 L2 中。当我阅读
particles[c.particle_id_1].position
我将一些数据从 L2 复制到 L1(或直接复制到寄存器)。
position1 += something
我修改了 L1(或寄存器)。终于在
particles[c.particle_id_2].position = position1
,我将数据从 L1(或寄存器)刷新回 L2,对吗?因此,如果我想在此之后运行第二个计算着色器,并且第二个着色器将读取粒子的位置,则我不需要同步
Particles
.只放置一个执行屏障就足够了,没有内存屏障
void vkCmdPipelineBarrier(
VkCommandBuffer commandBuffer,
VkPipelineStageFlags srcStageMask, // here I put VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
VkPipelineStageFlags dstStageMask, // here I put VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT
VkDependencyFlags dependencyFlags, // here nothing
uint32_t memoryBarrierCount, // here 0
const VkMemoryBarrier* pMemoryBarriers, // nullptr
uint32_t bufferMemoryBarrierCount, // 0
const VkBufferMemoryBarrier* pBufferMemoryBarriers, // nullptr
uint32_t imageMemoryBarrierCount, // 0
const VkImageMemoryBarrier* pImageMemoryBarriers); // nullptr
最佳答案
Vulkan 的内存模型并不将“缓存”视为缓存。它的模型建立在可用性和可见性的概念之上。如果命令/阶段 A 与命令/阶段 B 具有执行依赖性,则 GPU 命令/阶段 A 产生的值对 GPU 命令/阶段 B“可用”。GPU 命令/阶段 A 产生的值对 GPU“可见”命令/阶段 B 如果命令/阶段 A 与命令/阶段 B 具有内存依赖关系,则关于所讨论的特定内存以及 A 写入它和 B 将访问它的访问模式。
如果某个值对命令/阶段既不可用也不可见,则尝试访问它会产生未定义的行为。
可用性和可见性的实现将涉及清除缓存等。但就 Vulkan 内存模型而言,这是一个它并不关心的实现细节。您也不应该:了解 Vulkan 内存模型并编写在其中运行的代码。
您的管道屏障会创建执行依赖项,但不会创建内存依赖项。因此,在屏障之前由 CS 进程写入的值对之后的 CS 进程可用,但对它们不可见。您需要具有内存依赖性才能建立可见性。
但是,如果您想要 GPU 级别的理解……这完全取决于 GPU。 GPU 是否具有缓存层次结构、L1/L2 拆分?也许有些人会,也许不会。
无论如何,这都无关紧要,因为仅将值写入内存中的地址并不等同于“刷新”该内存周围的适当缓存。即使使用 coherent
限定符只会导致在同一调度调用中执行的计算着色器操作刷新。不能保证会影响以后的调度调用。
关于vulkan - Vulkan 计算着色器缓存和屏障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68663665/
我有一个使用临界区的 Windows DLL(C 语言)。多次调用的特定例程需要在第一次调用时执行一些初始化代码,因此我使用了临界区。但是,由于它被调用了很多次,我试图避免每次调用时都进入该部分的开销
我想确保正确实现障碍。现在,每次调用 amStaticThreaded 时都会启动大量新线程。在我的主例程中,amStaticThreaded 之后的所有事情都只能由一个线程完成,但那部分速度非常快。
我想实现自定义 Java 屏障。我不想使用 CyclicBarrier class . 所以所有线程都在一个公共(public)点相遇。只有当所有线程都到达屏障时,线程才会继续。 我想使用 wait/
您好,很抱歉发布了一大堆代码,但我对 C 代码还很陌生,基本上我正在做一项大学作业,我必须实现一个“pthread_barrier”,现在我理解了屏障的概念(或者至少我认为我这样做)但我只是不确定我应
什么是boost:barrier,如何使用这种boost方法。你能不能给我一个清楚的例子,因为我找到了下面的例子: bool wait() { boost::mutex
我正在尝试在 cython 中使用 openmp。我需要在 cython 中做两件事: i) 在我的 cython 代码中使用 #pragma omp single{} 作用域。 ii) 使用#pra
所以这是代码: #pragma omp parallel private (myId) { set_affinity(); myId = omp_get_thread_num(); if
我正在尝试在 cython 中使用 openmp。我需要在 cython 中做两件事: i) 在我的 cython 代码中使用 #pragma omp single{} 作用域。 ii) 使用#pra
我正在尝试创建一个 C 代码来对具有多个线程的数组进行排序,因此我需要使用屏障来同步威胁 void sort(struct ThreadArguments* args){ struct
这些天我正在阅读有关内存栅栏和屏障的内容,作为同步多线程代码和避免代码重新排序的一种方法。 我通常在 Linux 操作系统下使用 C++ 进行开发,并且大量使用 boost 库,但我找不到任何与之相关
我正在编写一个 SMT 程序,并且正在尝试解决一个有趣的问题。 我需要所有函数一起退出,但是有些线程卡在障碍物上,即使我不希望它们这样做。 我的问题是:当我删除障碍时会发生什么?卡在屏障处的线程会释放
可能是我没有理解线程的屏障概念。但是我写了一段代码,我想了解它是否正确使用了 barrier。 代码如下: #!/usr/bin/env python3 # -*- coding: utf-8 -*-
我想编写可移植代码(Intel、ARM、PowerPC...)来解决一个经典问题的变体: Initially: X=Y=0 Thread A: X=1 if(!Y){ do something
我有一个 n 的二维网格x n元素。在一次迭代中,我通过平均相邻元素的值来计算一个元素的值。即: for(int i=0;i
我是 MPI 新手,在尝试使用障碍时遇到了 fatal error 。我有一个简单的 for 循环,它以循环方式将索引分配给每个进程,紧随其后的是 MPI 屏障: mpi.cc #include #
我正在使用 gdrive和 gshell为了与我的 Google 帐户交互并下载文件,请获取他们的信息。 当我运行时:gdrive about或 gdown about ,我收到以下消息 Initia
运行以下代码时,2个启动线程将被CyclicBarrier *对象锁定,并无限等待第三个线程解锁 import java.util.concurrent.BrokenBarrierException;
我是一名优秀的程序员,十分优秀!