如何从CUDA-KERNEL代码中从字符数组元素中打印单词



我有一个文本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或多维阵列的更通用处理,请参阅此答案。

最新更新