我有点难以理解如何将2D数组发送到Cuda。我的程序解析一个每行有30个数据点的大文件。我一次读取10行,然后为每行和每个项目创建矩阵(因此,在我的示例中,有10行,每行30个数据点,它将是
到目前为止,这是我所做的,但没有成功(注意:sizeofbucket = 行数,sizeOfBucketsHoldings = 每行的项目数...我知道我应该获得奇怪变量名称奖项):
我收到的错误信息是:
这是我在主函数中声明总数组的方法: ```html
int list [10] [30];
)。我的目标是将这个数组发送到我的内核,并让每个块处理一行(在普通的C语言中,我已经完美地实现了这一点,但Cuda有点更具挑战性)。到目前为止,这是我所做的,但没有成功(注意:sizeofbucket = 行数,sizeOfBucketsHoldings = 每行的项目数...我知道我应该获得奇怪变量名称奖项):
int list[sizeOfBuckets][sizeOfBucketsHoldings]; //this is created at the start of the file and I can confirmed its filled with the correct data
#define sizeOfBuckets 10 //size of buckets before sending to process list
#define sizeOfBucketsHoldings 30
//Cuda part
//define device variables
int *dev_current_list[sizeOfBuckets][sizeOfBucketsHoldings];
//time to malloc the 2D array on device
size_t pitch;
cudaMallocPitch((int**)&dev_current_list, (size_t *)&pitch, sizeOfBucketsHoldings * sizeof(int), sizeOfBuckets);
//copy data from host to device
cudaMemcpy2D( dev_current_list, pitch, list, sizeOfBuckets * sizeof(int), sizeOfBuckets * sizeof(int), sizeOfBucketsHoldings * sizeof(int),cudaMemcpyHostToDevice );
process_list<<<count,1>>> (sizeOfBuckets, sizeOfBucketsHoldings, dev_current_list, pitch);
//free memory of device
cudaFree( dev_current_list );
__global__ void process_list(int sizeOfBuckets, int sizeOfBucketsHoldings, int *current_list, int pitch) {
int tid = blockIdx.x;
for (int r = 0; r < sizeOfBuckets; ++r) {
int* row = (int*)((char*)current_list + r * pitch);
for (int c = 0; c < sizeOfBucketsHoldings; ++c) {
int element = row[c];
}
}
我收到的错误信息是:
main.cu(266): error: argument of type "int *(*)[30]" is incompatible with parameter of type "int *"
1 error detected in the compilation of "/tmp/tmpxft_00003f32_00000000-4_main.cpp1.ii".
第266行是内核调用process_list<<<count,1>>> (count, countListItem, dev_current_list, pitch);
。我认为问题在于我尝试在函数中创建一个int *类型的数组,但我还能以其他方式创建它吗?在我的纯C代码中,我使用int current_list[num_of_rows][num_items_in_row]
,这可以工作,但我无法让相同的结果在CUDA中工作。
我的最终目标很简单,我只想让每个块处理每一行(sizeOfBuckets),然后让它循环遍历该行中的所有项目(sizeOfBucketHoldings)。最初我只是做了普通的cudamalloc和cudaMemcpy,但它没有起作用,所以我四处寻找,发现了MallocPitch和2dcopy(这两者都不在我的cuda by example
书中),我一直在尝试研究示例,但它们似乎给我带来了同样的错误(我目前正在阅读的CUDA_C编程指南在第22页上找到了这个想法,但仍然没有运气)。 有什么想法吗?或建议去哪里看?
编辑: 为了测试这个,我只想把每一行的值加起来(我从cuda by example数组加法示例中复制了逻辑)。 我的内核:
__global__ void process_list(int sizeOfBuckets, int sizeOfBucketsHoldings, int *current_list, size_t pitch, int *total) {
//TODO: we need to flip the list as well
int tid = blockIdx.x;
for (int c = 0; c < sizeOfBucketsHoldings; ++c) {
total[tid] = total + current_list[tid][c];
}
}
这是我在主函数中声明总数组的方法: ```html
这是我在主函数中声明总数组的方法:
```int *dev_total;
cudaMalloc( (void**)&dev_total, sizeOfBuckets * sizeof(int) );