gpt4 book ai didi

cuda - CUDA 中的 HAAR 小波变换

转载 作者:行者123 更新时间:2023-12-02 15:52:34 28 4
gpt4 key购买 nike

我尝试在 CUDA 中实现一维数组的 HAAR 小波变换。

算法

我在输入数组中有 8 个索引

有了这个条件if(x_index>=o_width/2 || y_index>=o_height/2)我将有4个线程,应该是0,2,4,6,我计划处理两个输入中每个索引的索引。

我计算 avg.EG:如果我的线程 id 为“0”,则 avg 为 (input[0]+input[1])/2,然后同时我得到输入的差异[ 0]-avg 等其余线程。

现在重要的是输出的放置。我为输出创建了一个单独的 thread_id,因为使用索引 0、2、4、6 会导致将输出放置在正确的索引中产生困难。

我的 avgs 应该放在前 4 个索引中,即输出的 0,1,2,3,o_thread_id 应该是 0,1,2,3。同样,为了将差异放在 4,5,6,7 处,我用“4”增加了 0,1,2,3,如代码所示

问题

我的输出全为零!!!无论我改变什么,我都会得到它。

代码

__global__ void cal_haar(int input[],float output [],int i_widthstep,int o_widthstep,int o_width,int o_height)
{

int x_index=blockIdx.x*blockDim.x+threadIdx.x;
int y_index=blockIdx.y*blockDim.y+threadIdx.y;

if(x_index>=o_width/2 || y_index>=o_height/2) return;

int i_thread_id=y_index*i_widthstep+(2*x_index);
int o_thread_id=y_index*o_widthstep+x_index;

float avg=(input[i_thread_id]+input[i_thread_id+1])/2;
float diff=input[i_thread_id]-avg;
output[o_thread_id]=avg;
output[o_thread_id+4]=diff;

}

void haar(int input[],float output [],int i_widthstep,int o_widthstep,int o_width,int o_height)
{

int * d_input;
float * d_output;

cudaMalloc(&d_input,i_widthstep*o_height);
cudaMalloc(&d_output,o_widthstep*o_height);

cudaMemcpy(d_input,input,i_widthstep*o_height,cudaMemcpyHostToDevice);

dim3 blocksize(16,16);
dim3 gridsize;
gridsize.x=(o_width+blocksize.x-1)/blocksize.x;
gridsize.y=(o_height+blocksize.y-1)/blocksize.y;

cal_haar<<<gridsize,blocksize>>>(d_input,d_output,i_widthstep,o_widthstep,o_width,o_height);


cudaMemcpy(output,d_output,o_widthstep*o_height,cudaMemcpyDeviceToHost);

cudaFree(d_input);
cudaFree(d_output);

}

以下是我的主要功能:-

void main()
{
int in_arr[8]={1,2,3,4,5,6,7,8};
float out_arr[8];
int i_widthstep=8*sizeof(int);
int o_widthstep=8*sizeof(float);
haar(in_arr,out_arr,i_widthstep,o_widthstep,8,1);

for(int c=0;c<=7;c++)
{cout<<out_arr[c]<<endl;}
cvWaitKey();

}

你能告诉我哪里出了问题吗?它给了我零作为输出?谢谢。

最佳答案

您的代码存在以下问题:

if(x_index>=o_width/2 || y_index>=o_height/2) return;

给定o_height = 1,我们有o_height/2 = 0(o_heightint,所以我们这里有整数除法并向下舍入),因此没有线程执行任何操作。要实现您想要的效果,您可以在此处进行浮点算术,或使用 (o_height+1)/2(o_width+1)/2:它将执行使用“算术”舍入进行除法(您将得到 ( x_index >= (8+1)/2/*= 4*/&& y_index >= (1+1)/2/*= 1*/))

此外,当 Y 维度上有超过 1 个线程时,寻址会出现问题,因为那时您的 i_thread_ido_thread_id 计算将是错误的( _withstep 是以字节为单位的大小,但您将其用作数组索引)。

关于cuda - CUDA 中的 HAAR 小波变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10726090/

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