gpt4 book ai didi

CUDA同步和读取全局内存

转载 作者:行者123 更新时间:2023-12-04 20:52:58 24 4
gpt4 key购买 nike

我有这样的事情:

__global__ void globFunction(int *arr, int N) {
int idx = blockIdx.x* blockDim.x+ threadIdx.x;
// calculating and Writing results to arr ...
__syncthreads();
// reading values of another threads(ex i+1)
int val = arr[idx+1]; // IT IS GIVING OLD VALUE
}


int main() {
// declare array, alloc memory, copy memory, etc.
globFunction<<< 4000, 256>>>(arr, N);
// do something ...
return 0;
}

为什么我在阅读 arr[idx+1] 时会得到旧值?我打了电话 __syncthreads ,所以我希望看到更新的值。我做错了什么?我是在读缓存还是什么?

最佳答案

使用 __syncthreads()函数只同步当前块中的线程。在这种情况下,这将是您在启动内核时创建的每个块 256 个线程。因此,在您给定的数组中,对于跨越到另一个线程块的每个索引值,您最终将从全局内存中读取一个与当前块中的线程不同步的值。

您可以做的一件事是使用 __shared__ 创建共享线程本地存储来规避此问题。 CUDA 指令允许块中的线程在它们之间共享信息,但阻止其他块中的线程访问为当前块分配的内存。一旦您在块中的计算完成(并且您可以使用 __syncthreads() 来完成此任务),您就可以将共享块级存储中的值复制回全局可访问的内存中。

您的内核可能类似于:

__global__ void globFunction(int *arr, int N) 
{
__shared__ int local_array[THREADS_PER_BLOCK]; //local block memory cache
int idx = blockIdx.x* blockDim.x+ threadIdx.x;

//...calculate results
local_array[threadIdx.x] = results;

//synchronize the local threads writing to the local memory cache
__syncthreads();

// read the results of another thread in the current thread
int val = local_array[(threadIdx.x + 1) % THREADS_PER_BLOCK];

//write back the value to global memory
arr[idx] = val;
}

如果您必须跨块同步线程,您应该寻找另一种方法来解决您的问题,因为当问题可以分解为块时,CUDA 编程模型最有效,并且线程同步只需要在块内进行。

关于CUDA同步和读取全局内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8234568/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com