CUDA:如何使用纹理和char4(或int4)在每个线程的一个事务中读取4(或16)个字符?

时间:2012-08-02 15:23:53

标签: cuda textures texture-packing

我在访问的设备全局内存中有一个大字符数组 通过线程以合并方式。我读过某个地方,我可以加快速度 通过在每个线程的一个内存事务中读取4或16个字符来进行内存访问。 我相信我必须使用纹理和char4或int4结构。然而, 我找不到任何关于此的文档或示例。请问有人在这里吗? 提供一个简单的例子或指示我可以在哪里了解更多信息?

在我的代码中,我将char数组定义为

char *database = NULL;
cudaMalloc( (void**) &database, SIZE * sizeof(char) );

如果我想使用纹理和char4(或int4),定义是什么?

非常感谢。

1 个答案:

答案 0 :(得分:1)

我终于找到了自己问题的答案。 char4的定义 会是

char4 *database = NULL;
cudaMalloc( (void**) &database, SIZE * sizeof(char4)/4 );

不需要纹理。内核的加速速度提高了三倍 使用char4但如果我循环展开则减少到两个。为了完整起见 我的内核是

__global__ void kernel(unsigned int jobs_todo, char* database, float* results ) {

  unsigned int id = threadIdx.x + blockIdx.x * blockDim.x;
  float A = 0; int i; char ch;
  if(id < jobs_todo) {
    for(i = 0; i < 1000; i += 1){
     ch = database[jobs_todo*i + id];
     if(ch == 'A') A++;
    }
    results[id] = A;
  }
}

使用char4

__global__ void kernel4(unsigned int jobs_todo, char4* database, float* results ) {

  unsigned int id = threadIdx.x + blockIdx.x * blockDim.x;
  float A = 0; int i; char4 ch4;
  if(id < jobs_todo) {
    for(i = 0; i < 1000/4; i += 1){
     ch4 = database[jobs_todo*i + id];
     if(ch4.x == 'A') A++;
     if(ch4.y == 'A') A++;
     if(ch4.z == 'A') A++;
     if(ch4.w == 'A') A++;
    }
    results[id] = A;
  }
}

我也尝试过int4,但它比char4时间快了.0002秒。