24小时热门版块排行榜    

北京石油化工学院2026年研究生招生接收调剂公告
查看: 374  |  回复: 1

hsfy919

银虫 (初入文坛)

[求助] CUDA并行问题,全部金币悬赏

最近在研究CUDA做并行运算,刚开始接触,不是很明白共享内存(shared memory)的机理
问题是:我要利用CUDA函数做N1个数组相加,每个数组长度为N2,由于数组很多(大概上百万个)不能通过CPU直接传入GPU中,需要在GPU中通过计算每个线程得到一个数组,完成计算后所有线程的数组相加,得到长度为N2的一个数组,输出出来。可由于线程之间彼此不能通信,想用shared memory来解决求和,但结果不对(我编写的程序如下)。

这个程序正确的结果应该是C=[150,300,450,600,750],但得到的结果却是C=[750,750,750,750,750]
希望大家看看,如果能解决问题,全部金币奉上

#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>
#include <fstream>
using namespace std;

#define NumberOfBlock 128
#define ThreadPerBlock 256

__global__ void addKernel(int *c, int *p, int *a, int *b, int N)
{
    int id = threadIdx.x + blockIdx.x*blockDim.x, cacheindex=threadIdx.x, i, j, ii;
        double temp, temp2;
        __shared__ double cache[ThreadPerBlock];
        for(j=0;j<N;j++)  // 问题在于当j循环到1时,得到的值覆盖了数组C中j=0时的值,当j=2时覆盖了j=0和1的值,后面也是
        {
                i=id;
            temp=0;
                while(i<N)
                {
                        temp+=a*b[j];
                        i+=gridDim.x*blockDim.x;
                }
//----对每个j规约求和--------------------------------------------------------------------
                cache[cacheindex]=temp;
                __syncthreads();
                ii=blockDim.x/2;
                while(ii!=0)
                {
                        if(cacheindex<ii)
                                cache[cacheindex]+=cache[cacheindex+ii];
                                __syncthreads();
                                ii/=2;
                }
                if(cacheindex==0)
                        p[blockIdx.x]=cache[0];
                __syncthreads();
                temp2=0;
                for(ii=0;ii<NumberOfBlock;ii++)
                        temp2+=p[ii];
                __syncthreads();
                c[j]=temp2;
//--------------------------------------------------------------------------------
        }

}

int main()
{
    const int size = 5;  //以5个元素举例,实际问题元素很多,过百万个
    int a[size] = { 1, 2, 3, 4, 5 };
    int b[size] = { 10, 20, 30, 40, 50 };
        int c[size];
        for(int i=0;i<size;i++)
                c = 0;
    int *dev_a = 0;
    int *dev_b = 0;
    int *dev_c = 0;
        int *dev_p = 0;

        int *p=new int [NumberOfBlock];
        for(int i=0;i<NumberOfBlock;i++)
                p=0;
   
    cudaMalloc((void**)&dev_c, size * sizeof(int));
    cudaMalloc((void**)&dev_p, NumberOfBlock * sizeof(int));
    cudaMalloc((void**)&dev_a, size * sizeof(int));
    cudaMalloc((void**)&dev_b, size * sizeof(int));
    cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(dev_c, c, size * sizeof(int), cudaMemcpyHostToDevice);
    cudaMemcpy(dev_p, p, NumberOfBlock * sizeof(int), cudaMemcpyHostToDevice);

    addKernel<<<NumberOfBlock, ThreadPerBlock>>>(dev_c, dev_p, dev_a, dev_b, size);  
    cudaDeviceSynchronize();

    cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
    for(int i=0;i<size;i++)
        cout<<c<<endl;
    cudaFree(dev_c);
    cudaFree(dev_a);
    cudaFree(dev_b);
        getchar();
}
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

希望优秀成为一种习惯
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

水博士

木虫 (正式写手)

尝试一下用单线程读写,是否正确
2楼2015-03-09 10:55:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 hsfy919 的主题更新
最具人气热帖推荐 [查看全部] 作者 回/看 最后发表
[考研] 326求调剂 +8 崽崽仔 2026-04-02 8/400 2026-04-02 23:00 by 无际的草原
[考研] 一志愿郑州大学材料与化工085600,求调剂 +10 吃的不少 2026-04-02 10/500 2026-04-02 22:58 by 马儿快快地跑
[考研] 考研调剂 +3 李木子0120 2026-04-02 5/250 2026-04-02 21:45 by dongzh2009
[考研] 322求调剂:一志愿湖南大学 材料与化工(085600),已过六级。 +12 XX小邓 2026-03-29 13/650 2026-04-02 21:39 by 百灵童888
[考研] 372分材料与化工(085600)一志愿湖南大学求调剂 +5 蓝笺片 2026-04-02 6/300 2026-04-02 21:37 by dongzh2009
[考研] 349求调剂 +10 zwjjjjjj 2026-03-31 10/500 2026-04-02 20:13 by dongzh2009
[考研] 求调剂 302分初试 0854 +5 伶可乐 2026-04-02 5/250 2026-04-02 17:53 by 笔落锦州
[考研] 282求调剂 +13 呼吸都是减肥 2026-04-01 13/650 2026-04-02 14:10 by baoball
[考研] 085900土木水利336分求调剂 +4 Zhangjiangj 2026-03-31 6/300 2026-04-02 11:40 by 1753564080
[考研] 085601 材料工程 313分 求调剂 +7 Ong3 2026-03-27 7/350 2026-04-02 11:29 by 3041
[考研] 266求调剂 +4 学员97LZgn 2026-04-02 4/200 2026-04-02 09:52 by yulian1987
[考研] 279求调剂 +6 学而思兮知 2026-04-01 6/300 2026-04-02 09:16 by vgtyfty
[考研] 化学工程专硕324分,一志愿中国矿业大学求调剂 +7 耿耿1314 2026-04-01 7/350 2026-04-02 07:40 by 尚水阁主
[考研] 08工科275分求调剂 +13 AaAa7420 2026-03-31 13/650 2026-04-02 06:19 by 286640313
[考研] 291求调剂 +20 Y-cap 2026-03-29 25/1250 2026-04-01 23:49 by 欣喜777
[考研] 379求调剂 +3 ?苦瓜不苦 2026-04-01 3/150 2026-04-01 20:09 by 暮云清寒
[考研] 材料科学与工程求调剂 +13 深V宿舍吧 2026-03-29 13/650 2026-03-31 19:50 by Dyhoer
[考研] 本2一志愿C9-333分,材料科学与工程,求调剂 +9 升升不降 2026-03-31 9/450 2026-03-31 18:01 by 无际的草原
[考研] 274求调剂 +6 xiao爱同学 2026-03-30 6/300 2026-03-31 10:04 by cal0306
[考研] 药学105500求调剂 +3 Ssun。。 2026-03-28 3/150 2026-03-28 11:24 by lxf170613
信息提示
请填处理意见