CUDA编程问题3

CUDA编程问题3,cuda,Cuda,我有两个一维数组。现在我必须对这两个数组执行“anding”,如果数组的元素相等,那么我必须将元素放入2d数组中 我已经编写了以下代码,但我的代码不起作用。谁能告诉我我做错了什么 #include<stdio.h> #include<stdio.h> #include<cuda.h> #define height 3 #define width 2 __global__ void fun(unsigned char *c ,unsigned short *s

我有两个一维数组。现在我必须对这两个数组执行“anding”,如果数组的元素相等,那么我必须将元素放入2d数组中

我已经编写了以下代码,但我的代码不起作用。谁能告诉我我做错了什么

#include<stdio.h>
#include<stdio.h>
#include<cuda.h>
#define height 3
#define width 2

__global__ void fun(unsigned char *c ,unsigned short *s,unsigned char *u,size_t pitch)
{ 

    int tid =blockIdx.x * blockDim.x + threadIdx.x ;
    //int tidy=blockIdx.y * blockDim.y + threadIdx.y ;

    if(tid<6)
    {

        for (int r = 0; r < height; ++r)
        {        //float* row = (float*)((char*)u + r*pitch);

                for (int d = 0; d< width; ++d) 
                {
                    u[r*width+d] = c[tid] & s[tid];
                }
        }
    } 
}


int main()
{
    int i,j;
    unsigned char man[6]="manis",*dev_c,jan[3][2],*dev_r;

    unsigned short a[6]={32,33,43,35,36,37},*dev_s;

    size_t pitch;

    cudaMalloc((void**)&dev_c,sizeof( unsigned char)*6);       // memory allocation on device

    cudaMalloc((void**)&dev_s,sizeof(unsigned short)*6);

    cudaMallocPitch((void**)&dev_r, &pitch, width*sizeof(unsigned char),height);

    cudaMemcpy(dev_c,man, 6*sizeof(unsigned char),cudaMemcpyHostToDevice);

    cudaMemcpy(dev_s,a, 6*sizeof(short int),cudaMemcpyHostToDevice);

    fun<<<5,2>>>(dev_c,dev_s,dev_r,pitch);

    cudaMemcpy2D(jan,3*sizeof(unsigned char),dev_r,pitch,sizeof( unsigned char),2,cudaMemcpyDeviceToHost);

    printf("\nThe call is completd");

    for ( i=0; i < width; i++)
    {
        for (j=0; j < height; j++)
        {
            printf("%d ",jan[j+i*width]);
        }
#包括
#包括
#包括
#定义高度3
#定义宽度2
__全局无效乐趣(无符号字符*c、无符号短*s、无符号字符*u、大小\u t音高)
{ 
int tid=blockIdx.x*blockDim.x+threadIdx.x;
//int-tidy=blockIdx.y*blockDim.y+threadIdx.y;

如果(tid这段代码有这么多错误,那么几乎不可能写出一个合理的答案。但是,没有特定的顺序,我可以看到以下内容:

  • 设备内存中存在多个缓冲区溢出,主要原因是使用25个线程写入分配了4或5个字的数组
  • 您的内核包含一个可怕的内存竞争。线程将覆盖其他线程的输出,这在CUDA中会产生未定义的行为
  • 内核中的while循环将 产生无限循环行为 内核可能永远不会终止 结果,
  • 你一直在问2D数组,但是 代码中没有二维数组。 一切都是线性的一维内存 我所能看到的
  • 那会让你忙上一段时间


    编辑:另一天,代码的另一个完全不同的版本,所以还有一些评论:

  • 您的内核现在是完全串行的。前6个线程都将尝试用不同的结果覆盖输出数组。这是一场内存竞赛
  • 您在内核中混合了
    char
    unsigned short
    数据类型。这可能意味着您在8位和16位值之间执行and操作,然后将结果存储在8位类型中。即使没有内存争用,我也相当肯定这不是您想要的
  • 大约第十次,我将重复我自己-
    cudamallocitch
    分配带填充的线性内存,以使其成为GPU内存控制器和纹理单元的良好大小。它不是分配2D数组。因此,如果要访问该线性内存,需要使用
    cudamalocpit返回的基音ch
    调用。访问内存的公式在中,但我将在这里重复:

    T*pElement=(T*)((char*)基址+行*间距)+列;

  • 程序中的每个API调用都会返回一个错误代码。您应该检查每个API调用,以查看是否检测到任何运行时错误


  • 你没有说什么不起作用。你到底有什么问题?请给你的问题一个有意义的标题,这个标题对任何人都有什么帮助?完全同意Talonmes。请给你的帖子一个描述性的标题。你给所有的帖子一个通用的标题,这些标题没有说明你要问的具体问题ving.hi现在我更改了我的代码,我的代码正在运行。但仍然存在不可嘲笑的行为。请解释我的行为,代码将在下一篇评论中。有一件事我想说的是,我使用cudamallock pitch,并将开发视为我在gpu上的2d。请在这个问题上给我更多启发,因为关于这个主题没有写太多。在我的下一个注释是对数组元素执行“and”运算并将其放入一个二维数组中的新代码。请告诉我我的逻辑错误及其解决方案。这将帮助我理解cudaglobal void fun(无符号字符c、无符号短*s、无符号字符*r)的概念{int tid=blockIdx.x*blockDim.x+threadIdx.x;int tid=blockIdx.y*blockDim.y+threadIdx.y;如果(tid)剩余代码cudaMalloc((void**)和dev_s,sizeof(unsigned short)*6;cudamallocpatch((void**)和dev r,&pitch,2*sizeof(unsigned char),3);cudaMemcpy(dev c,man,6*sizeof(unsigned char),cudamemcoptodev(短int),cudamemcpyhostodice);fun(dev_c,dev_s,dev_r);cudaMemcpy2D(jan,2*sizeof(unsigned char),dev_r,pitch,sizeof(unsigned char),2,cudaMemcpyDeviceToHost);用于(i=0;i请帮助这名新手编辑您的问题,以反映代码更改和剩余问题。这些注释完全不可读。您正在冒着这个问题像上次一样被关闭的风险。