我是CUDA的新手.如何分配大小为MXN的2D数组?如何在CUDA中遍历该数组?给我一个示例代码................................................... ..........................................
嗨..谢谢你的回复.我在下面的程序中使用了你的代码.但我没有得到正确的结果.
__global__ void test(int A[BLOCK_SIZE][BLOCK_SIZE], int B[BLOCK_SIZE][BLOCK_SIZE],int C[BLOCK_SIZE][BLOCK_SIZE])
{
int i = blockIdx.y * blockDim.y + threadIdx.y;
int j = blockIdx.x * blockDim.x + threadIdx.x;
if (i < BLOCK_SIZE && j < BLOCK_SIZE)
C[i][j] = A[i][j] + B[i][j];
}
int main()
{
int d_A[BLOCK_SIZE][BLOCK_SIZE];
int d_B[BLOCK_SIZE][BLOCK_SIZE];
int d_C[BLOCK_SIZE][BLOCK_SIZE];
int C[BLOCK_SIZE][BLOCK_SIZE];
for(int i=0;i<BLOCK_SIZE;i++)
for(int j=0;j<BLOCK_SIZE;j++)
{
d_A[i][j]=i+j;
d_B[i][j]=i+j;
}
dim3 dimBlock(BLOCK_SIZE, BLOCK_SIZE);
dim3 dimGrid(GRID_SIZE, GRID_SIZE);
test<<<dimGrid, dimBlock>>>(d_A,d_B,d_C);
cudaMemcpy(C,d_C,BLOCK_SIZE*BLOCK_SIZE , cudaMemcpyDeviceToHost);
for(int i=0;i<BLOCK_SIZE;i++)
for(int j=0;j<BLOCK_SIZE;j++)
{
printf("%d\n",C[i][j]);
}
}
Run Code Online (Sandbox Code Playgroud)
请帮我.
我是cuda的新手.我想将两个2d数组加到第三个数组中.我使用以下代码:
cudaMallocPitch((void**)&device_a, &pitch, 2*sizeof(int),2);
cudaMallocPitch((void**)&device_b, &pitch, 2*sizeof(int),2);
cudaMallocPitch((void**)&device_c, &pitch, 2*sizeof(int),2);
Run Code Online (Sandbox Code Playgroud)
现在我的问题是我不想在我的内核代码中使用这些数组作为扁平的二维数组我希望di使用两个for循环并将结果放在第三个数组中
__global__ void add(int *dev_a ,int *dev_b,int* dec_c)
{
for i=0;i<2;i++)
{
for j=0;j<2;j++)
{
dev_c[i][j]=dev_a[i][j]+dev_b[i][j];
}
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能在CUDA做到这一点?请告诉我如何以这种方式使用二维阵列?
使用2d-array的内核调用应该是什么?如果可能,请使用代码示例进行说明.
在线上有很多关于在CUDA上分配,复制,索引等2d和3d数组的问题。我得到了很多矛盾的答案,因此我试图汇编过去的问题,看看我是否可以提出正确的问题。
第一个链接:https : //devtalk.nvidia.com/default/topic/392370/how-to-cudamalloc-two-Dimension-array-/
问题:分配二维指针数组
用户解决方案:使用mallocPitch
“正确”的低效率解决方案:在for循环中为每行使用malloc和memcpy(荒谬的开销)
“更正确”的解决方案:将其压缩为1d数组的“专业意见”,有评论说没有人关注性能,但在gpu上使用2d指针结构
第二个链接:https : //devtalk.nvidia.com/default/topic/413905/passing-a-multiDimension-array-to-kernel-how-to-allocate-space-in-host-and-pass-to-device -/
问题:在主机上分配空间并将其传递给设备
子链接:https : //devtalk.nvidia.com/default/topic/398305/cuda-programming-and-performance/dynamically-allocate-array-of-structs/
子链接解决方案:在GPU上编码基于指针的结构是一种糟糕的体验,并且效率极低,因此将其压缩为一维数组。
第三个链接:在CUDA中的设备内存上分配2D阵列
问题:分配和传输二维数组
用户解决方案:使用mallocPitch
其他解决方案:将其展平
第四个链接:如何在CUDA中使用2D阵列?
问题:分配和遍历二维数组
提交的解决方案:不显示分配
其他解决方案:压扁
还有许多其他消息来源大多在说同样的话,但是在多个实例中,我看到有关GPU上指针结构的警告。
许多人认为分配指针数组的正确方法是为每行调用malloc和memcpy,但函数mallocPitch和memcpy2D存在。这些功能的效率有所降低吗?为什么这不是默认答案?
二维数组的另一个“正确”答案是将它们压缩成一个数组。我是否应该习惯生活中的事实?我对我的代码非常拘谨,对我来说感觉很不雅。
我正在考虑的另一种解决方案是使使用1d指针数组的矩阵类最大化,但是我找不到实现双括号运算符的方法。
还要根据此链接:将对象复制到设备?
和子链接答案:cudaMemcpy分段错误
这有点浮躁。
我想全部使用CUDA的类都具有2 / 3d数组,将这些转换为CUDA的1d数组会不会有很多开销?
我知道我已经问了很多问题,但总的来说,我应该习惯于将数组压缩为现实,还是可以使用二维分配和复制函数而不会产生不好的开销,例如在for中调用alloc和cpy的解决方案中环?