gpt4 book ai didi

c - CUDA 中的 tex1Dfetch 和流

转载 作者:行者123 更新时间:2023-11-30 20:26:53 37 4
gpt4 key购买 nike

我一直在尝试使用流和一维纹理,但每次我查看它的内部时,纹理似乎都是空的。一开始我的计划是使用 2 个流,但我无法访问纹理,因此我将流的数量减少到 1 个(用于调试),将内核减少到 1 个线程的 1 个 block ,如下所示。

#include <stdio.h>
#include <string.h>
#include <cuda.h>

texture <int,1,cudaReadModeElementType> tex1;

__global__
void textureTest(int *out){
int tid = blockIdx.x * blockDim.x + threadIdx.x;
float x;
int i;
for(i=0; i<30*8; i++){
x = tex1Dfetch(tex1, i);
printf("%d: %d \n ",i,x);
}
out[0]=x;
}

void testTextureCPU(){
const int N = 100/2;
int *array_d0;
int *array_d1;
int *array_h;
int x=0;
int *out_d0 =(int *)calloc(1, sizeof(int));
int *out_d1 =(int *)calloc(1, sizeof(int));
int *out_h =(int *)calloc(2, sizeof(int));

cudaStream_t stream0, stream1;
cudaStreamCreate(&stream0);
cudaStreamCreate(&stream1);

cudaHostAlloc((void**)&array_d0, (30 * 8*sizeof(int)),cudaHostAllocDefault);
cudaHostAlloc((void**)&array_d1, (30 * 8*sizeof(int)),cudaHostAllocDefault);
cudaHostAlloc((void**)&array_h, (30 * 8*sizeof(int)),cudaHostAllocDefault);

cudaMalloc((void **)&out_d0, 1 *sizeof(int));
cudaMalloc((void **)&out_d1, 1 *sizeof(int));
cudaHostAlloc((void**)&out_h, (2*sizeof(int)),cudaHostAllocDefault);


array_h[8 * 10 + 0] = 10;
array_h[8 * 11 + 1] = 11;
array_h[8 * 12 + 2] = 12;
array_h[8 * 13 + 3] = 13;
array_h[8 * 14 + 4] = 14;
array_h[8 * 15 + 5] = 15;
array_h[8 * 16 + 6] = 16;
array_h[8 * 17 + 7] = 17;

for(x=0; x<2; x++){

cudaMemcpyAsync(array_d0, array_h, (30 * 8*sizeof(int)), cudaMemcpyHostToDevice, stream0);
cudaMemcpyAsync(array_d1, array_h, (30 * 8*sizeof(int)), cudaMemcpyHostToDevice, stream1);

cudaBindTexture(NULL,tex1,array_d0, (30 * 8 *sizeof(int)));

textureTest<<<1,2,0,stream0>>>(out_d0);

cudaBindTexture(NULL,tex1,array_d0, (30 * 8 *sizeof(int)));

textureTest<<<1,2,0,stream1>>>(out_d1);

cudaMemcpyAsync(out_h+x, out_d0 , 1 * sizeof(int), cudaMemcpyDeviceToHost, stream0);
cudaMemcpyAsync(out_h+x+N, out_d1 ,1 * sizeof(int), cudaMemcpyDeviceToHost, stream1);
}
}

int main(void){
testTextureCPU();
return 0;
}

但我无法弄清楚这段代码有什么问题,以及如何使其适用于一个或多个流。

最佳答案

您编辑的代码包含许多绝对基本的错误,这些错误与纹理或其与流的使用无关:

  1. 在内核中,有一个损坏的 printf 语句,它将浮点值视为整数
  2. 在主机代码中,用于填充纹理的主机内存大部分未初始化
  3. 在主机循环内,第二个 cudaMemcpyAsync 调用出现严重的缓冲区溢出

如果修复了这三件事,代码就会按预期工作。我建议您将来多加注意代码的质量。

关于c - CUDA 中的 tex1Dfetch 和流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23555150/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com