首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CUDA数据初始化

CUDA数据初始化
EN

Stack Overflow用户
提问于 2019-04-15 06:11:45
回答 1查看 573关注 0票数 0

就有关CUDA的教程而言,大多数数据是通过内核调用发送到设备的。我想知道我是否可以执行Init数据--进程--清理cuda中的某种操作。这是我尝试过的代码,但它似乎不起作用。

代码语言:javascript
复制
#include <cuda.h>
#include <stdio.h>
#include <cuda_runtime.h>

#define CUDA_CHECK_VALUE(value, a) {                            \
    cudaError_t _m_cudaStatus = value;                          \
    if(_m_cudaStatus != cudaSuccess) {                          \
        printf("Error &s at line %d in file %s\n",              \
                cudaGetErrorString(_m_cudaStatus),              \
                __LINE__, __FILE__);                            \
        exit(1);                                                \
    } else {printf("Done! - %d\n", a);} }

__constant__
float* data;

__host__ __device__
void initMemory(int size){
    CUDA_CHECK_VALUE(cudaMalloc(&data, sizeof(float) * size), 0);
    float *ha = new float[size];
    for(int i =0; i < size; i++){
        ha[i] = i * 1.0f;
    }
    CUDA_CHECK_VALUE(cudaMemcpyToSymbol(data, ha, sizeof(float) * size, 0, cudaMemcpyHostToDevice), 1);
    CUDA_CHECK_VALUE(cudaDeviceSynchronize(), 2);
}

__host__ __device__
void freeMemory(){
    CUDA_CHECK_VALUE(cudaDeviceSynchronize(), 3);
    cudaFree(data);
}

__global__
void print(int size){
    printf("size = %d\n", size);
    for(int i = 0; i < size; i++){
        printf("data[%d] = %f\n", i, data[i]);
    }
}

int main(){
    int size = 1024;

    initMemory(size);
    printf("1\n");
    print<<<1, 1>>>(size);
    printf("2\n");
    cudaDeviceSynchronize();
    freeMemory();
    printf("3\n");
}

在这段代码中,我试图将一些由主机初始化的数据保存一次,并为多次调用准备内核进程,最后通过清理方法释放cuda内存。但是我不太确定这是否是正确的使用CUDA的方式,以及如何相应地修改我的代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-15 14:11:23

在不过分强调这一点的情况下,可以公平地说,在您在问题中显示的代码的两个版本中,几乎所有的内容都是错误的。因此,展示一个工作版本的样子比解释两次尝试中不正确的内容要简单得多:

代码语言:javascript
复制
#include <cuda.h>
#include <stdio.h>
#include <cuda_runtime.h>

#define CUDA_CHECK_VALUE(value, a) {                            \
    cudaError_t _m_cudaStatus = value;                          \
    if(_m_cudaStatus != cudaSuccess) {                          \
        printf("Error %s at line %d in file %s\n",              \
                cudaGetErrorString(_m_cudaStatus),              \
                __LINE__, __FILE__);                            \
        exit(1);                                                \
    } else {printf("Done! - %d\n", a);} }

__device__ float* data;

void initMemory(int size){
    float* da;
    CUDA_CHECK_VALUE(cudaMalloc(&da, sizeof(float) * size), 0);
    float *ha = new float[size];
    for(int i =0; i < size; i++){
        ha[i] = i * 1.0f;
    }
    CUDA_CHECK_VALUE(cudaMemcpy(da, ha, sizeof(float) * size, cudaMemcpyHostToDevice), 1);
    CUDA_CHECK_VALUE(cudaMemcpyToSymbol(data, &da, sizeof(da), 0, cudaMemcpyHostToDevice), 2);
    CUDA_CHECK_VALUE(cudaDeviceSynchronize(), 3);
    delete[] ha;
}

void freeMemory(){
    CUDA_CHECK_VALUE(cudaDeviceSynchronize(), 4);
    float* da;
    CUDA_CHECK_VALUE(cudaMemcpyFromSymbol(&da, data, sizeof(da), 0, cudaMemcpyDeviceToHost), 5);
    CUDA_CHECK_VALUE(cudaFree(da), 6);
}

__global__
void print(int size){
    for(int i = 0; i < size; i++){
        printf("data[%d] = %f\n", i, data[i]);
    }
}

int main(){
    int size = 1024;

    initMemory(size);
    printf("1\n");
    print<<<1, 1>>>(size);
    cudaDeviceSynchronize();
    printf("2\n");
    freeMemory();
    printf("3\n");
}

以下几点:

  1. 重要的是要认识到initMemoryfreeMemory都在代码中的主机上运行。用__device__装饰代码并不能自动使代码在设备上运行。它只将代码的一个版本编译为可以在内核中调用的设备函数。但是,在任何时候,您都不会这样做,所以所有的代码都在主机上运行,因为这就是您调用它的地方。
  2. __shared____constant__内存无法从主机动态分配,正如我们在代码的两次迭代中所尝试的那样
  3. initMemoryfreeMemory的第二个实现需要使用许多额外的CUDA主机API函数,这样才能使事情正常工作,从上面的代码中可以看出这一点。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55683408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档