繁体   English   中英

Cuda内存在每个线程中共享

[英]Cuda Memory shared in every threads

我今天从CUDA开始冒险。 我正在尝试在所有线程之间共享一个unsigned int。 所有线程都会修改该值。 我使用cudaMemcpy将这个值复制到设备上。 但是,最后,当计算完成时,我收到了该值等于0的信息。

也许有多个线程正在同时写入此变量? 我不确定在线程开始写时还是应该使用任何信号量或锁定此变量。

编辑:

很难详细说明,因为我的问题通常是如何解决。 实际上,我没有编写任何算法,只是测试CUDA。

但是,如果您愿意...我创建了包含一些值(无符号整数)的向量。 我试图做一些类似搜索大于给定共享值的值的操作,但是,当vector的值较大时,我将向vector元素加1并保存共享值。

看起来像这样:

__global__ void method(unsigned int *a, unsigned int *b, long long unsigned N) {
    int idx = blockIdx.x* blockDim.x+ threadIdx.x;
    if (a[idx]>*b && idx < N) 
        *b = a[idx]+1;
}

正如我说的那样,它仅对测试而言不是有用的代码,但我不知道该怎么做...

如果该值位于共享内存中,则它将仅在单个多处理器中运行的每个线程(即每个线程块)本地,而不是在针对该内核运行的每个线程本地。 如果您希望每个线程同时写入变量,则肯定需要执行原子操作(例如atomicAdd等)。 请注意,尽管这将序列化所有并发线程请求以写入变量。

“我的问题通常是如何为每个线程全局使用共享内存。”

阅读不需要任何特别的东西。 您所做的工作可以在Fermi设备上更快地进行,因为它们具有缓存,而在其他设备上则较慢。

如果要在其他线程更改后读取该值,则无法等待所有线程完成其操作,然后再读取所需的值,因此可能不是您期望的值。 在所有正在运行的线程之间同步全局内存中的值的唯一方法是使用不同的内核。 更改值后,您要在所有线程之间共享,内核完成,然后启动一个将与共享值一起使用的新线程。

要使每个线程写入相同的内存位置,您必须使用原子操作,但是请记住,应将原子操作保持在最低限度,因为这样可以有效地序列化执行。

要知道可用的原子函数读取CUDA C编程指南的部分B.11 可以在这里找到

您要求的是:

__global__ void method(unsigned int *a, unsigned int *b, long long unsigned N) {
    int idx = blockIdx.x* blockDim.x+ threadIdx.x;
    if (a[idx]>*b && idx < N) 
        //*b = a[idx]+1;
        atomicAdd(b, a[idx]+1);
}

编辑-删除的错误

尽管理想情况下您不想这样做-除非您可以确定所有线程都将花费大约相同的时间,请参阅Cuda线程教程

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM