我刚启动CUDA编程,并试图执行下面显示的代码。这个想法是复制一个二维数组到设备中,计算所有元素的总和,然后检索总和(我知道这个算法没有并行化,实际上它做了更多的工作,然后是必要的。作为memcopy的练习)。CUDA - memcpy2d - 错误间距
#include<stdio.h>
#include<cuda.h>
#include <iostream>
#include <cutil_inline.h>
#define height 50
#define width 50
using namespace std;
// Device code
__global__ void kernel(float* devPtr, int pitch,int* sum)
{
int tempsum = 0;
for (int r = 0; r < height; ++r) {
int* row = (int*)((char*)devPtr + r * pitch);
for (int c = 0; c < width; ++c) {
int element = row[c];
tempsum = tempsum + element;
}
}
*sum = tempsum;
}
//Host Code
int main()
{
int testarray[2][8] = {{4,4,4,4,4,4,4,4},{4,4,4,4,4,4,4,4}};
int* sum =0;
int* sumhost = 0;
sumhost = (int*)malloc(sizeof(int));
cout << *sumhost << endl;
float* devPtr;
size_t pitch;
cudaMallocPitch((void**)&devPtr, &pitch, width * sizeof(int), height);
cudaMemcpy2D(devPtr,pitch,testarray,0,8* sizeof(int),4,cudaMemcpyHostToDevice);
cudaMalloc((void**)&sum, sizeof(int));
kernel<<<1, 4>>>(devPtr, pitch, sum);
cutilCheckMsg("kernel launch failure");
cudaMemcpy(sumhost, sum, sizeof(int), cudaMemcpyDeviceToHost);
cout << *sumhost << endl;
return 0;
}
此代码编译得很好(在4.0 sdk发布候选版本上)。但是当我尝试执行,我得到
0
cpexample.cu(43) : cutilCheckMsg() CUTIL CUDA error : kernel launch failure : invalid pitch argument.
这是不幸的,因为我不知道如何解决它;-(。据我所知,在球场是在内存偏移允许更快的复制的数据。然而,这样的间距在设备存储器中仅使用,而不是在主机存储器,是吗?因此,我的主机存储器的间距应为0,不应该吗?
此外我还想问另外两个问题:
- 如果我声明一个像int * sumhost这样的变量(见上面),这个地方在哪里呃指向?首先到主机内存和cudaMalloc到设备内存之后?
- cutilCheckMsg在这种情况下非常方便。是否有类似的调试功能,我应该知道?
感谢这个非常翔实的答案... :-) – ftiaronsem 2011-05-19 23:56:21
没问题,很高兴它帮助了:-) – Jason 2011-05-20 01:52:17