Cuda的线程和块无法正常工作

杰伊

我正在cuda中制作算法,以便在Visual Studio 2010中进行图像处理。在我的编码中,我遇到了处理cuda的线程和块的问题。因此,我的C和CUDA示例代码如下,C代码可以正常工作,但是CUDA代码不能完全正常工作。我的C代码

void checkGpuBlockValue(unsigned int *a,unsigned int *b,int length)
{
    for(int i=0;i<length;i++){
        b[i]=a[i]+i;
    }

}

int main()
{
    const int range=1000;
    unsigned int *a=new unsigned int[range];
    unsigned int *b=new unsigned int[range];

    for(int i=0;i<range;i++)
    {
        a[i]=i;
    }

checkGpuBlockValue(a,b,range);

for(int j=0;j<range;j++)
    {
        cout<<"b["<<j<<"] = "<<b[j]<<std::endl;
    }
}

输出=

OutPut :
b[0] = 0
b[1] = 2
b[2] = 4
b[3] = 6
b[4] = 8
.
.
.
.
.

b[996] = 1992
b[997] = 1994
b[998] = 1996
b[999] = 1998

这很好。

我的CUDA代码(运行不正常)是;

__global__
void checkGpuBlockValue(unsigned int *a,unsigned int *b,int length)
{
    unsigned int i = (blockIdx.x * blockDim.x) + threadIdx.x;

    if(i<length){
        b[i]=a[i]+i;
    }

}

int main()
{
    const int range=1000;
    unsigned int *a=new unsigned int[range];
    unsigned int *b=new unsigned int[range];

    unsigned int *dev_a;
    unsigned int *dev_b;

    for(int i=0;i<range;i++)
    {
        a[i]=i;
    }

    cudaMalloc( (void**)&dev_a, range* sizeof(unsigned int));
    cudaMalloc( (void**)&dev_b, range* sizeof(unsigned int));

    cudaMemcpy(dev_a, a, range, cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b, a, range, cudaMemcpyHostToDevice);

    static const int BLOCK_WIDTH = 8;       

    //1024 is the maximum number of threads per block for modern GPUs.

    int x = static_cast<int>(ceilf(static_cast<float>(range) / BLOCK_WIDTH));


    const dim3 grid (x,1);                              
    const dim3 block(BLOCK_WIDTH,1);    

    checkGpuBlockValue<<<grid,block>>>(dev_a,dev_b,range);
    cudaDeviceSynchronize();

    cudaMemcpy(b, dev_b, range, cudaMemcpyDeviceToHost);


    for(int j=0;j<range;j++)
    {
        cout<<"b["<<j<<"] = "<<b[j]<<std::endl;
    }

    cudaFree(dev_a);
    cudaFree(dev_b);
}

输出为:

Out Put =
b[0] = 0
b[1] = 2
b[2] = 4
b[3] = 6
.
.
.
.
.
b[242] = 484
b[243] = 486
b[244] = 488
b[245] = 490
b[246] = 492
b[247] = 494
b[248] = 496
b[249] = 498
b[250] = 3452816845
b[251] = 3452816845
b[252] = 3452816845
b[253] = 3452816845
b[254] = 3452816845
b[255] = 3452816845
b[256] = 3452816845
.
.
.
.
.
.
b[996] = 3452816845
b[997] = 3452816845
b[998] = 3452816845
b[999] = 3452816845

在我的代码中,将值0到1000放入int * a中,然后添加* a的值从0到1000,结果存储在int * b中。因此,我的代码对于0到249(最多250个)循环是很好的,但是在250之后,它给出了错误的值。那么我在这里做什么错了?请给我建议。

萨加尔·马苏蒂(Sagar masuti)

仅通过查看代码,您的问题就出现在这些行中

 cudaMemcpy(dev_a, a, range, cudaMemcpyHostToDevice);
 cudaMemcpy(dev_b, a, range, cudaMemcpyHostToDevice);
 ....
 ....
 cudaMemcpy(b, dev_b, range, cudaMemcpyDeviceToHost);

应该

 cudaMemcpy(dev_a, a, range* sizeof(unsigned int), cudaMemcpyHostToDevice);
 cudaMemcpy(dev_b, a, range* sizeof(unsigned int), cudaMemcpyHostToDevice);
 ....
 ....
 cudaMemcpy(b, dev_b, range * sizeof(unsigned int), cudaMemcpyDeviceToHost);

我只是通过修改您的代码来检查它是否按预期工作。但是我强烈建议您按照正确的编程习惯进行正确的错误检查。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CUDA 和线程块开销

来自分类Dev

睡眠线程无法正常工作

来自分类Dev

CUDA C 编程指南:线程和块索引计算如何工作?

来自分类Dev

基本的javascript无法正常工作-显示块

来自分类Dev

显示内联块无法正常工作

来自分类Dev

显示:内联块无法正常工作

来自分类Dev

Java多线程似乎无法正常工作

来自分类Dev

新的多线程无法正常工作

来自分类Dev

通用线程池类无法正常工作

来自分类Dev

Python Selenium多线程无法正常工作

来自分类Dev

python:无法使线程类实例正常工作

来自分类Dev

Ruby,Sinatra:线程无法正常工作

来自分类Dev

Hystrix线程池队列无法正常工作

来自分类Dev

启动大量线程和块时,CUDA printf()崩溃

来自分类Dev

启动大量线程和块时,CUDA printf()崩溃

来自分类Dev

确定用于图像处理的CUDA线程和块

来自分类Dev

Python线程脚本无法正常启动/正常工作

来自分类Dev

为什么在多线程工作时调试无法正常工作

来自分类Dev

CUDA线程如何工作

来自分类Dev

Confluence 5.1中的代码块主题无法正常工作

来自分类Dev

布局无法正常工作(块级元素,宽度:50%)

来自分类Dev

使用块内容时,Django CSS无法正常工作

来自分类Dev

Confluence 5.1中的代码块主题无法正常工作

来自分类Dev

为什么if块中的条件无法正常工作?

来自分类Dev

nginx代理无法正常工作的服务器块

来自分类Dev

try catch 块中的 xunit 核心无法正常工作

来自分类Dev

多个独立的 webpack 包:块加载无法正常工作

来自分类Dev

OpenCL(来自CUDA的端口)中的bruteforce无法正常工作

来自分类Dev

为什么AddVector CUDA c ++无法正常工作?

Related 相关文章

热门标签

归档