我在 GPU 端(cuda)定义了一个像这样的新数据类型:
typedef union {
int i;
double d;
long l;
char s[16];
} data_unit;
data_unit *d_array;
在 Java 中,我们有一个数组,其中一种类型在已定义的联合中可用。通常,如果我们有一个 int 类型的数组,我们可以在 Java (JCuda) 中执行以下操作:
import static jcuda.driver.JCudaDriver.*;
int data_size;
CUdeviceptr d_array;
int[] h_array = new int[data_size];
cuMemAlloc(d_array, data_size * Sizeof.INT);
cuMemcpyHtoD(d_array, Pointer.to(h_array), data_size * Sizeof.INT);
但是如果设备上有一个数组,它的类型是我们的联合,怎么办?(假设 h_array 仍然是 int 类型)
int data_size;
CUdeviceptr d_array;
int[] h_array = new int[data_size];
cuMemAlloc(d_array, data_size * Sizeof.?);
// Here we should have some type of alignment (?)
cuMemcpyHtoD(d_array, Pointer.to(h_array), data_size * Sizeof.?);