CUDA设备指针操作

pmc*_*mcr 3 pointers cuda

我用过:

float *devptr;
//...
cudaMalloc(&devptr, sizeofarray);
cudaMemcpy(devptr, hostptr, sizeofarray, cudaMemcpyHostToDevice);
Run Code Online (Sandbox Code Playgroud)

在CUDA C中分配和填充数组.现在我正在尝试运行cuda内核,例如:

__global__ void kernelname(float *ptr)
{
   //...
}
Run Code Online (Sandbox Code Playgroud)

在该数组中但具有偏移值.在C/C++中,它会像这样:

kernelname<<<dimGrid, dimBlock>>>(devptr+offset);
Run Code Online (Sandbox Code Playgroud)

但是,这似乎不起作用.

有没有办法在没有将偏移值发送到单独的参数中的内核并在内核代码中使用该偏移量的情况下执行此操作?关于如何做到这一点的任何想法?

tal*_*ies 9

指针算术在CUDA中运行得很好.您可以在主机代码中向CUDA指针添加偏移量,它将正常工作(记住偏移量不是字节偏移量,它是普通字或元素偏移量).

编辑:一个简单的工作示例:

#include <cstdio>
int main(void)
{

    const int na = 5, nb = 4;
    float a[na] = { 1.2, 3.4, 5.6, 7.8, 9.0 };
    float *_a, b[nb];

    size_t sza = size_t(na) * sizeof(float);
    size_t szb = size_t(nb) * sizeof(float);

    cudaFree(0);

    cudaMalloc((void **)&_a, sza );
    cudaMemcpy( _a, a, sza, cudaMemcpyHostToDevice);
    cudaMemcpy( b, _a+1, szb, cudaMemcpyDeviceToHost);

    for(int i=0; i<nb; i++)
        printf("%d %f\n", i, b[i]);

    cudaThreadExit();
}
Run Code Online (Sandbox Code Playgroud)

在这里,您可以看到在第二次cudaMemcpy调用中已将字/元素偏移应用于设备指针,以从第二个字开始复制,而不是第一个字.