关于共享内存的使用

  • 3 replies
  • 1396 views
*

queqd

  • *
  • 10
    • 查看个人资料
关于共享内存的使用
« 于: 十一月 29, 2022, 11:06:50 am »
我在核函数中将全局内存赋值给共享内存进行使用,最后结果不正确,请问是赋值过程有问题还是使用过程有问题?
程序代码: [选择]
void __global__ kernel1(int i,float* d_M1, int* d_H, int* d_V, float* d_E1, float* d_E)
{
    const int n = blockDim.x * blockIdx.x + threadIdx.x;
    if (n < 2500)
    {
            extern __shared__ int s_H[];
            d_H[i * 2500 + n] = 1;
            s_H[threadIdx.x] = d_H[i*2500+n];
    for (int j = 0; j < 12; j++)
    {
            s_H[i * 2500 + n] *= d_V[(i * 2500 + n) * 12 + j];
    }

  for (int j = 0; j < 12; j++)
    {
             d_E[(i * 2500 + n) * 12 + j] = (-log(d_E1[i * 2500 + n]) - (-log(d_M1[(i * 2500 + n) * 12 + j]) / 2)) * s_H[i * 2500 + n];
    }

   }
}

Re: 关于共享内存的使用
« 回复 #1 于: 十二月 04, 2022, 11:46:05 am »
我在核函数中将全局内存赋值给共享内存进行使用,最后结果不正确,请问是赋值过程有问题还是使用过程有问题?
程序代码: [选择]
void __global__ kernel1(int i,float* d_M1, int* d_H, int* d_V, float* d_E1, float* d_E)
{
    const int n = blockDim.x * blockIdx.x + threadIdx.x;
    if (n < 2500)
    {
            extern __shared__ int s_H[];
            d_H[i * 2500 + n] = 1;
            s_H[threadIdx.x] = d_H[i*2500+n];
    for (int j = 0; j < 12; j++)
    {
            s_H[i * 2500 + n] *= d_V[(i * 2500 + n) * 12 + j];
    }

  for (int j = 0; j < 12; j++)
    {
             d_E[(i * 2500 + n) * 12 + j] = (-log(d_E1[i * 2500 + n]) - (-log(d_M1[(i * 2500 + n) * 12 + j]) / 2)) * s_H[i * 2500 + n];
    }

   }
}

你这样直接初始化了shared memory里的内容,然后大家集体就这样用,显然不行的。你需要添加同步的,在每次对shared memory的改动后,和下次读取前。

此外,同步你还不能放在if里面,你可能需要处理一下你的代码架构。

最后,看到你的下标较大,小心不要越界了。(如果你不是故意设计的如此,则需要检查你的下标使用的逻辑)

« 最后编辑时间: 十二月 04, 2022, 11:47:17 am 作者 屠戮人神 »

*

queqd

  • *
  • 10
    • 查看个人资料
Re: 关于共享内存的使用
« 回复 #2 于: 十二月 07, 2022, 10:03:45 am »
你这样直接初始化了shared memory里的内容,然后大家集体就这样用,显然不行的。你需要添加同步的,在每次对shared memory的改动后,和下次读取前。

此外,同步你还不能放在if里面,你可能需要处理一下你的代码架构。

最后,看到你的下标较大,小心不要越界了。(如果你不是故意设计的如此,则需要检查你的下标使用的逻辑)
我按照您说的问题进行了修改,现在程序可以正确运行,但是耗时却比使用全局内存还多,请问使用共享内存不一定会提高程序的运行速度吗?

Re: 关于共享内存的使用
« 回复 #3 于: 十二月 15, 2022, 02:03:32 pm »
我按照您说的问题进行了修改,现在程序可以正确运行,但是耗时却比使用全局内存还多,请问使用共享内存不一定会提高程序的运行速度吗?

使用共享内存不一定会总是提速的,这是一个正常现象。
不是特殊的银弹, 本身不具有灭杀狼人的魔法效果。