CUDA如何处理OpenCL中的线程偏移?

CUDA如何处理OpenCL中的线程偏移?,cuda,opencl,offset,Cuda,Opencl,Offset,例如,我可以在OpenCL中使用线程ID上的偏移启动内核,因此当使用多个GPU时,第二个GPU线程可以直接从任意整数值开始: GPU1: thread idx 0 to k GPU2: thread idx k+1 to N 对于所有GPU,内核可以完全相同: __kernel(..) { int threadId=get_global_id(0); // this starts from k+1 for GPU2 .. } 在CUDA中,当在驱动程序API中调用内核时,与此等价

例如,我可以在OpenCL中使用线程ID上的偏移启动内核,因此当使用多个GPU时,第二个GPU线程可以直接从任意整数值开始:

GPU1: thread idx 0 to k
GPU2: thread idx k+1 to N
对于所有GPU,内核可以完全相同:

__kernel(..)
{
   int threadId=get_global_id(0); // this starts from k+1 for GPU2
   ..
}
在CUDA中,当在驱动程序API中调用内核时,与此等价的是什么

OpenCL拥有

cl_int clEnqueueNDRangeKernel ( cl_command_queue command_queue,
    cl_kernel kernel,
    cl_uint work_dim,
    const size_t *global_work_offset, // this can be given k+1
    const size_t *global_work_size,
    const size_t *local_work_size,
    cl_uint num_events_in_wait_list,
    const cl_event *event_wait_list,
    cl_event *event)
我是否必须在内核中嵌入偏移量,例如下面的示例,以便在多GPU上使用外观最相似的内核

__global__ void vecAdd(.., int * gpuParams)
{
    int offset=gpuParams[0];
    int threadId = offset + blockIdx.x * blockDim.x + threadIdx.x;
}
这适用于平坦的缓冲区访问和内核

这个偏移量在每次内核启动之前都会动态更改,所以我想我不能使用define

Cuda驱动程序api具有以下启动内核的功能:

CUresult cuLaunchKernel ( CUfunction f, unsigned int  gridDimX, 
                unsigned int  gridDimY, unsigned int  gridDimZ, 
                unsigned int  blockDimX, unsigned int  blockDimY, 
                unsigned int  blockDimZ, unsigned int  sharedMemBytes, 
                CUstream hStream, void** kernelParams, void** extra )

CUDA中没有相应的功能,但您也不需要它

在标准的CUDA模型中,您不能通过一个API调用在多个设备上启动内核,从技术上讲,您也不能通过一个API调用在多个设备上分配内存。每个GPU实际上是独立的


NVIDIA在CUDA 9的新功能中引入了多设备启动和同步方法,但这与您所问的完全不同。

我知道CUDA不是OpenCL,但NVIDIA运行OpenCL并使用其线程偏移量,我需要像NVIDIA在后台做的那样吗?这是黑客级别的东西吗?我可以使用网格作为多个块大小的偏移量,但如何在第一个块中添加线程偏移量?我正在使用CUDA 8.0首次更新,但我会检查它,我记得我以前见过它,但我认为它只适用于双gpu图形卡。我发现CUDAMEMCPITOSYMBOL可以进行隐式偏移量数组初始化,而无需借助内核参数,并且内核对于所有gpu来说都是相同的,只需加上get_global_cuda_offsetdimension函数的实现。@huseyintugrulbuyukisik你不知道吗我也需要。任何CUDA指针类型都支持算术。您可以直接向任何指针添加偏移量,并将该偏移量传递给内核。唯一不能这样做的是使用符号,这就是为什么API调用有偏移量。你说得对,这更容易,但如果所有GPU也需要访问同一数组的元素1、2、3、4、5读取以及它们自己的范围写入它们自己的偏移量之后呢?那么这个指针技巧会使1,2,3,4,5无法达到吗?一个例子可以是所有对的nbody算法,但不写。我的目的是为所有设备提供完全相同的cuda内核字符串。但是在内核之前自动添加一些定义是可以的