我有两个一维数组。现在我必须执行'anding'这两个数组,如果数组的元素相等,那么我必须把元素放在一个二维数组中。
我编写了以下代码,但我的代码无效。谁能告诉我我做错了什么?
#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]);
}
有谁能告诉我我做错了什么?我使用 cudamallocpitch 在设备上分配2d然后我使用 cudamemcpy 将数组复制回主机上,但每次运行时代码都无法正常运行它显示所有新的值。
任何机构都可以解释我如何实现我的目标,即“将2个一维数组的元素放在一起并将结果放入2d”。
请忽略我的英语并帮助我。
答案 0 :(得分:1)
这段代码有很多错误,几乎不可能写出合理的答案。但是,没有特别的顺序,我可以看到以下内容:
这应该会让你忙碌一段时间。
char
和unsigned short
数据类型。这可能意味着您正在执行8位和16位值之间的操作,然后将结果存储为8位类型。即使没有记忆竞赛,我也很确定这不是你想要的。关于第十次,我将重复自己 - cudaMallocPitch
使用填充分配线性内存,使其成为GPU内存控制器和纹理单元的良好大小。它没有分配2D数组。因此,如果要访问该线性内存,则需要使用cudaMallocPitch
调用返回的音高。访问内存的公式在documentation,但我将在此重复:
T* pElement = (T*)((char*)BaseAddress + Row * pitch) + Column;
程序中的每个API调用都会返回错误代码。您应该检查每一个以查看是否检测到任何运行时错误。