如何使用GPGPU有效地执行加载和按位操作?

时间:2014-09-27 10:31:04

标签: c cuda bit-manipulation shared-memory gpgpu

我需要将128到256字节长度的数组加载到GPU共享内存。 我想在有效执行按位操作的同时最小化全局内存访问。 让我们解释一下。

我有一个256字节的数组加载到全局内存,我想在内核代码的开头将所有256个字节加载到共享内存。

然后,在每个字节上必须执行按位操作,而此操作可以应用于两个一个字节变量,两个2字节变量或两个4字节和更大。 问题是:

  1. 如果我为每个线程加载16bytes的数组,那么我只有一个 内存访问(warp size)*(16bytes)数据或最佳方式 每个线程4个字节?
  2. 如果我将每个线程16个字节加载到共享内存中,那么我将使用相同的16bytes变量将这个16字节进行OR操作以将位设置为1?
  3. 如果我为每个线程加载16个字节,那么对16字节数据类型的OR操作更快或者是4字节数据类型还是更小的数据类型?
  4. 例如我想将第3位设置为1

        __shared__ (which data type?) temp = ((which data type?) *)array[i];
        temp |= (a variable with third bit set to 1)
    

    数组在全局内存上,我希望通过最小的全局内存访问将其加载到共享内存。

1 个答案:

答案 0 :(得分:1)

将内存事务的大小与银行大小相匹配。大多数情况下,银行大小为32位。从Kepler开始,您可以通过调用cudaDeviceSharedMemConfig()

指定64位的银行大小

Acceleware拥有关于该主题的良好资源:

http://acceleware.com/blog/maximizing-shared-memory-bandwidth-nvidia-kepler-gpus