我有一个文本char数组,充满了文本文件中的单词。
例如
text[0] = "one";
,
text[1] = "two";
等等。
所有等于线程计数的数组元素。我想使用CUDA将所有文本阵列打印到屏幕上。我尝试使用以下代码打印,但它不起作用。我很困惑如何将text[][]
这样的数组传递给CUDA内核函数。
#define MAX_SIZE 100
#define elements 20
__global__ void calculate(char *d_text) {
int idx = threadIdx.x;
printf("test %s /n", d_text[idx]);
}
int main() {
char text[MAX_SIZE][MAX_SIZE]; // have text array with words
char *d_text;
cudaMalloc((void **)&d_data, DATA_BYTES);
cudaMemcpy(d_text, text, STRING_BYTES, cudaMemcpyHostToDevice);
calculate << < 1, elements >> > (d_text);
cudaDeviceSynchronize();
}
CUDA中的多维数组通常在主机和设备之间移动数据时需要"深拷贝"操作。但是,在这种情况下,我们可以利用以下事实:您的数组的宽度是固定的(在MAX_SIZE
上已知)。我们可以定义这种宽度的类型,以使2D数组处理大约与1D数组处理一样简单:
$ cat t426.cu
#include <stdio.h>
const char s1[] = "one ";
const char s2[] = "two ";
const int MAX_SIZE = 10;
typedef char carr[MAX_SIZE];
__global__ void calculate(carr *text) {
int idx = threadIdx.x;
printf("test %s n", text[idx]);
}
int main() {
char text[MAX_SIZE][MAX_SIZE]; // have text array with words
memcpy(text[0], s1, sizeof(s1));
memcpy(text[1], s2, sizeof(s2));
carr *d_text;
cudaMalloc((void **)&d_text, MAX_SIZE*MAX_SIZE);
cudaMemcpy(d_text, text, MAX_SIZE*MAX_SIZE, cudaMemcpyHostToDevice);
calculate << < 1, 2 >> > (d_text);
cudaDeviceSynchronize();
}
$ nvcc -arch=sm_61 -o t426 t426.cu
$ cuda-memcheck ./t426
========= CUDA-MEMCHECK
test one
test two
========= ERROR SUMMARY: 0 errors
$
有关CUDA中2D或多维阵列的更通用处理,请参阅此答案。