cuda:使用共享内存

#include <iostream>
#include <cuda_runtime.h>

// 定义数组大小
const int arraySize = 1024;

// CUDA核函数,计算累加和
__global__ void sumArray(int* array, int* result) {
    __shared__ int sharedData[arraySize];  // 共享内存,用于线程协作

    int tid = threadIdx.x;
    int blockOffset = blockIdx.x * blockDim.x;

    // 将全局数组数据加载到共享内存中
    sharedData[tid] = array[blockOffset + tid];
    __syncthreads(); // 线程同步,等待所有线程加载完毕

    // 进行累加
    for (int stride = blockDim.x / 2; stride > 0; stride >>= 1) {
        if (tid < stride) {
            sharedData[tid] += sharedData[tid + stride];
        }
        __syncthreads(); // 线程同步,等待所有线程完成累加
    }

    // 累加结果写回全局内存
    if (tid == 0) {
        result[blockIdx.x] = sharedData[0];
    }
}

int main() {
    int hostArray[arraySize];
    int* deviceArray;
    int* deviceResult;
    int result[arraySize];

    // 初始化主机数组
    for (int i = 0; i < arraySize; ++i) {
        hostArray[i] = i;
    }

    // 在GPU上分配内存
    cudaMalloc((void**)&deviceArray, sizeof(int) * arraySize);
    cudaMalloc((void**)&deviceResult, sizeof(int) * arraySize);

    // 将主机数据复制到GPU
    cudaMemcpy(deviceArray, hostArray, sizeof(int) * arraySize, cudaMemcpyHostToDevice);

    // 计算线程块和线程数
    int blockSize = 256;
    int numBlocks = (arraySize + blockSize - 1) / blockSize;

    // 调用CUDA核函数
    sumArray << <numBlocks, blockSize >> > (deviceArray, deviceResult);

    // 将结果从GPU复制回主机
    cudaMemcpy(result, deviceResult, sizeof(int) * numBlocks, cudaMemcpyDeviceToHost);

    // 计算最终结果
    int finalResult = 0;
    for (int i = 0; i < numBlocks; ++i) {
        finalResult += result[i];
    }

    std::cout << "累加和: " << finalResult << std::endl;

    // 释放GPU内存
    cudaFree(deviceArray);
    cudaFree(deviceResult);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值