我试图开发一个小的 CUDA 程序来查找给定数组中的最大值,
int input_data[0...50] = 1,2,3,4,5....,50
Run Code Online (Sandbox Code Playgroud)
max_value由 的第一个值初始化input_data[0],最终答案存储在result[0]. 内核给出 0 作为最大值。我不知道是什么问题。我由 1 个块 50 个线程执行。
__device__ int lock=0;
__global__ void max(float *input_data,float *result)
{
float max_value = input_data[0];
int tid = threadIdx.x;
if( input_data[tid] > max_value)
{
do{} while(atomicCAS(&lock,0,1));
max_value=input_data[tid];
__threadfence();
lock=0;
}
__syncthreads();
result[0]=max_value; //Final result of max value
}
Run Code Online (Sandbox Code Playgroud)
尽管有内置函数,但我只是在练习小问题。
您正在尝试设置一个“关键部分”,但是 CUDA 上的这种方法可能会导致整个程序挂起 - 尽可能避免它。
为什么你的代码挂起?
您的内核(__global__函数)由 32 个线程组执行,称为warps。单个 warp 中的所有线程同步执行。因此,经纱将停止在您的经纱中,do{} while(atomicCAS(&lock,0,1))直到您的经纱中的所有线程都成功获得锁。但很明显,您希望防止多个线程同时执行临界区。这会导致挂起。
替代方案
您需要的是“并行缩减算法”。你可以从这里开始阅读:
| 归档时间: |
|
| 查看次数: |
11815 次 |
| 最近记录: |