Struct 将结构传递给CUDA内核

Struct 将结构传递给CUDA内核,struct,cuda,alignment,Struct,Cuda,Alignment,我是CUDA C的新手,正在尝试将typedef'd结构传递到内核中。当我尝试使用只包含int的结构时,我的方法工作得很好,但是当我切换到float时,我得到的结果是没有意义的数字。我假设这与对齐有关,我尝试在类型声明中包含\uuu align\uu,但没有效果。有人能给我举个例子说明如何做到这一点,或者提供一种替代方法吗?我正在尝试设置它,以便可以轻松地添加或删除字段,而无需更改结构和内核以外的任何内容。我的代码: typedef struct __align__(8) { float

我是CUDA C的新手,正在尝试将typedef'd结构传递到内核中。当我尝试使用只包含int的结构时,我的方法工作得很好,但是当我切换到float时,我得到的结果是没有意义的数字。我假设这与对齐有关,我尝试在类型声明中包含
\uuu align\uu
,但没有效果。有人能给我举个例子说明如何做到这一点,或者提供一种替代方法吗?我正在尝试设置它,以便可以轻松地添加或删除字段,而无需更改结构和内核以外的任何内容。我的代码:

typedef struct __align__(8)
{
    float a, b;
} point;

__global__ void testKernel(point *p)
{
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    p[i].a = 1.1;
    p[i].b = 2.2;
}

int main(void)
{
        // set number of points 
    int numPoints    = 16,
        gpuBlockSize = 4,
        pointSize    = sizeof(point),
        numBytes     = numPoints * pointSize,
        gpuGridSize  = numPoints / gpuBlockSize;

        // allocate memory
    point *cpuPointArray = new point[numPoints],
          *gpuPointArray = new point[numPoints];
    cpuPointArray = (point*)malloc(numBytes);
    cudaMalloc((void**)&gpuPointArray, numBytes);

        // launch kernel
    testKernel<<<gpuGridSize,gpuBlockSize>>>(gpuPointArray);

        // retrieve the results
    cudaMemcpy(cpuPointArray, gpuPointArray, numBytes, cudaMemcpyDeviceToHost);
    printf("testKernel results:\n");
    for(int i = 0; i < numPoints; ++i)
    {
        printf("point.a: %d, point.b: %d\n",cpuPointArray[i].a,cpuPointArray[i].b);
    }

        // deallocate memory
    free(cpuPointArray);
    cudaFree(gpuPointArray);

    return 0;
}
typedef结构对齐(8)
{
浮子a、b;
}点;
__全局无效测试内核(点*p)
{
int i=blockIdx.x*blockDim.x+threadIdx.x;
p[i].a=1.1;
p[i].b=2.2;
}
内部主(空)
{
//设定点数
int numPoints=16,
gpuBlockSize=4,
pointSize=sizeof(点),
numBytes=numPoints*pointSize,
gpuGridSize=numPoints/gpuBlockSize;
//分配内存
点*cpuPointArray=新点[numPoints],
*gpuPointArray=新点[numPoints];
cpuPointArray=(点*)malloc(numBytes);
cudamaloc((void**)和gpuPointArray,numBytes);
//启动内核
testKernel(gpuPointArray);
//检索结果
cudaMemcpy(cpuPointArray、gpuPointArray、numBytes、cudaMemcpyDeviceToHost);
printf(“测试内核结果:\n”);
对于(int i=0;i
看看CUDA include目录中的vector_types.h头是如何实现的。这应该已经给了你一些提示


但是,这里的主要问题是
printf
调用中的
%d
。你现在要打印的是浮点数,不是整数。因此,它们确实应该使用
%f

由于似乎没有任何关于如何实现这一点的正式文档,我想我应该在这里发布最终修订的代码。原来
\uuuuu align\uuuu
部分也是不必要的,实际问题是在尝试打印浮动时在printf中使用了%d

#include <stdlib.h>
#include <stdio.h>

typedef struct
{
    float a, b;
} point;

__global__ void testKernel(point *p)
{
    int i = blockIdx.x * blockDim.x + threadIdx.x;
    p[i].a = 1.1;
    p[i].b = 2.2;
}

int main(void)
{
        // set number of points 
    int numPoints    = 16,
        gpuBlockSize = 4,
        pointSize    = sizeof(point),
        numBytes     = numPoints * pointSize,
        gpuGridSize  = numPoints / gpuBlockSize;

        // allocate memory
    point *cpuPointArray,
          *gpuPointArray;
    cpuPointArray = (point*)malloc(numBytes);
    cudaMalloc((void**)&gpuPointArray, numBytes);

        // launch kernel
    testKernel<<<gpuGridSize,gpuBlockSize>>>(gpuPointArray);

        // retrieve the results
    cudaMemcpy(cpuPointArray, gpuPointArray, numBytes, cudaMemcpyDeviceToHost);
    printf("testKernel results:\n");
    for(int i = 0; i < numPoints; ++i)
    {
        printf("point.a: %f, point.b: %f\n",cpuPointArray[i].a,cpuPointArray[i].b);
    }

        // deallocate memory
    free(cpuPointArray);
    cudaFree(gpuPointArray);

    return 0;
}
#包括
#包括
类型定义结构
{
浮子a、b;
}点;
__全局无效测试内核(点*p)
{
int i=blockIdx.x*blockDim.x+threadIdx.x;
p[i].a=1.1;
p[i].b=2.2;
}
内部主(空)
{
//设定点数
int numPoints=16,
gpuBlockSize=4,
pointSize=sizeof(点),
numBytes=numPoints*pointSize,
gpuGridSize=numPoints/gpuBlockSize;
//分配内存
点*cpuPointArray,
*GPU点阵列;
cpuPointArray=(点*)malloc(numBytes);
cudamaloc((void**)和gpuPointArray,numBytes);
//启动内核
testKernel(gpuPointArray);
//检索结果
cudaMemcpy(cpuPointArray、gpuPointArray、numBytes、cudaMemcpyDeviceToHost);
printf(“测试内核结果:\n”);
对于(int i=0;i
点*gpuPointArray=new。。。我觉得不对吗?您在主机上进行分配,然后在设备上执行cudamaloc…在将内存作为参数传递给内核之前,我不需要分配内存吗?不使用cudamaloc行会导致“未指定的启动失败”。我也可以将gpuPointArray设置为NULL,但它似乎不会改变我的原始结果。绝对不会。你需要Cudamaloc。你不需要在它之前有“新的”。cpuPointArray也是如此。使用malloc和free(您正在编程C),不要在这里使用新的。(永远不要混合使用新的malloc delete和free)好的,我已经研究了vector_types.h,并尝试了它们所做的:
typedef struct\uuuu align\uu2*sizeof(float))point{
…,但它仍然会产生相同的结果。这里还有什么我应该看到的吗?顺便说一句,将printf更改为使用%f而不是%d…这会改变什么吗?你现在正在尝试打印浮点,而不是int…这个答案可能是一个注释。谢谢你的提示@bamboon。这是一个老生常谈。似乎我从未集成从评论到答案的实际答案。现在已经这样做了。这应该使它更像一个答案。