Matlab Cuda块和线程ID

Matlab Cuda块和线程ID,matlab,indexing,cuda,Matlab,Indexing,Cuda,我对Matlab和CUDA有一些奇怪的问题。基本上,我有CUDA的代码,它打印以下内容 本地线程ID 本地块ID 局部块尺寸 全局线程ID CUDA代码 #include "cuda_runtime.h #include "device_launch_parameters.h" #include <stdio.h> //device functions __device__ int getGlobalidx_1d_1d() { return blockIdx.x *bl

我对Matlab和CUDA有一些奇怪的问题。基本上,我有CUDA的代码,它打印以下内容

  • 本地线程ID
  • 本地块ID
  • 局部块尺寸
  • 全局线程ID
  • CUDA代码

    #include "cuda_runtime.h
    #include "device_launch_parameters.h"
    #include <stdio.h>
    
    //device functions
     __device__ int getGlobalidx_1d_1d()
    
    {
        return blockIdx.x *blockDim.x + threadIdx.x;
    }
    
    //kernels
    __global__ void kernel_1D_1D()
    {
        printf("Local thread ID: %i  Local Block ID: %i, Local Block Dim: %i, Global Thread ID: %i\n", threadIdx.x, blockIdx.x, blockDim.x, getGlobalIdx_1D_1D());
    
    }
    
    int main()
    {
    printf("\nLaunching kernel as 1D grid of 1D blocks...\n");
    kernel_1D_1D<<<dim3(2,1,1), dim3(10,1,1)>>>();
    cudaDeviceReset();
    
    return 0;
    }
    
    Cuda Matlab代码

    function[returnValues] = Blocks_Threads_Test(blocks,threads)
    
    %1  Create Cuda Kernel Object
    
    k = parallel.gpu.CUDAKernel('BlocksThreads.ptx', 'BlocksThreads.cu','BlocksThreads');
    
    %2 Set Object properties
    
    k.GridSize = [blocks];
    k.ThreadBlockSize = [threads];
    
    %3 Set Argument Variables
    
    gpu_Values = gpuArray(ones(4,blocks*threads));
    
    [data] = feval(k, gpu_Values);
    
    
    returnValues = gather(data);
    
    #include "cuda_runtime.h"
    #include "device_launch_parameters.h"
    #include <stdio.h>
    
    __global__ void BlocksThreads(double *values) 
    {
        unsigned int bx = blockIdx.x;
        unsigned int tx = threadIdx.x;
        unsigned long int globalID = (bx*blockDim.x) + tx;
    
    
        values[(bx*blockDim.x) + (tx*4) + 0] = bx; //Block Number
        values[(bx*blockDim.x) + (tx*4) + 1] = tx; //Thread Number
        values[(bx*blockDim.x) + (tx*4) + 2] = globalID; 
        values[(bx*blockDim.x) + (tx*4) + 3] = blockDim.x; //Threads/Block
    }
    
    #包括“cuda_runtime.h”
    #包括“设备启动参数.h”
    #包括
    __全局无效块线程(双*值)
    {
    无符号整数bx=blockIdx.x;
    无符号整数tx=threadIdx.x;
    无符号长整型globalID=(bx*blockDim.x)+tx;
    值[(bx*blockDim.x)+(tx*4)+0]=bx;//块号
    值[(bx*blockDim.x)+(tx*4)+1]=tx;//线程数
    值[(bx*blockDim.x)+(tx*4)+2]=globalID;
    值[(bx*blockDim.x)+(tx*4)+3]=blockDim.x;//线程/块
    }
    
    有人知道为什么Matlab中线程、块和全局的id值到处都是吗?更不用说矩阵甚至没有填满整个过程

    如果相关的话,这就是我正在运行的

    • 赢7 64
    • VS 2012
    • Matlab 2013b 64
    • 英伟达GeForce GTX 770
    • 计算3.0

    您对
    矩阵的索引错误。改变

    values[(bx*blockDim.x) + (tx*4) + k] with k=0,1,2,3
    


    请不要提供图像或结果作为外部链接。当这些链接被破坏时,未来用户将很难正确理解您的问题。我无法直接发布图片,因为我缺乏声誉:(.一旦我得到10分,我将重新编辑帖子并直接为未来用户上传图片。您确定
    值的正确性吗[(bx*blockDim.x)+(tx*4)+k]
    k=0,1,2,3
    ?是否应将其更改为
    值[4*globalID+k]
    k=0,1,2,3
    ?您完全正确!问题是我在cuda中的索引方程返回值。非常感谢!
    values[4*globalID + k] with k=0,1,2,3