相关疑难解决方法(0)

并发写入相同的全局内存位置

我有几个块,每个块都有一个大小为512的共享内存数组中的整数.如何检查每个块中的数组是否包含零作为元素?

我正在做的是创建一个驻留在全局内存中的数组.此数组的大小取决于块的数量,并初始化为0.因此,a[blockid] = 1如果共享内存数组包含零,则每个块都会写入.

我的问题是当我在一个块中同时写几个线程时.也就是说,如果共享内存中的数组包含多个零,则会写入多个线程a[blockid] = 1.这会产生任何问题吗?

换句话说,如果2个线程将完全相同的值写入全局内存中完全相同的数组元素,那会不会有问题?

c c++ cuda

16
推荐指数
2
解决办法
6876
查看次数

将相同的值写入相同的内存位置会导致数据竞争吗?

请考虑以下代码,将相同的值写入多个线程的相同内存位置:

void f(int* buf, int n, int* p) {
    for(int i = 0; i < n; i++)
        buf[i] = i;
    *p = buf[n/2];
}

void g(int* buf, int n) {
    int x1, x2;
    thread t1(f, buf, n, &x1);
    thread t2(f, buf, n, &x2);
    t1.join();
    t2.join();
    assert(x1 == x2);
}
Run Code Online (Sandbox Code Playgroud)

虽然它很有意思,但我不太关心标准给出的保证,因为我猜它没有给出.我真正关心的是上述代码在真实世界多处理器硬件上的行为.是否assert总是通过或有任何竞争条件,缓存同步问题等的机会.?

c++ memory multithreading synchronization race-condition

14
推荐指数
2
解决办法
1123
查看次数

标签 统计

c++ ×2

c ×1

cuda ×1

memory ×1

multithreading ×1

race-condition ×1

synchronization ×1