我在访问的设备全局内存中有一个大字符数组 通过线程以合并方式。我读过某个地方,我可以加快速度 通过在每个线程的一个内存事务中读取4或16个字符来进行内存访问。 我相信我必须使用纹理和char4或int4结构。然而, 我找不到任何关于此的文档或示例。请问有人在这里吗? 提供一个简单的例子或指示我可以在哪里了解更多信息?
在我的代码中,我将char数组定义为
char *database = NULL;
cudaMalloc( (void**) &database, SIZE * sizeof(char) );
如果我想使用纹理和char4(或int4),定义是什么?
非常感谢。
答案 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秒。