2016-08-12 19 views
-2

我是一名CUDA初学者,尝试从GPU写入设备内存,以便我可以将其复制回主机并查看结果。为什么在写入设备内存时此CUDA程序崩溃?

这是我的代码,我剥了下来小我同时还获得了错误:

#include <iostream> 
#include <vector> 

bool verbose = true; 
int SIZE = 10; 

__global__ 
void assign_state(uint8_t * states) 
{ 
    states[threadIdx.x] = 42; 
} 

int main (int argc, char *argv[]) 
{ 

    // Create host states vector 
    if (verbose) std::cout << "Creating host memory... "; 

    std::vector<uint8_t> * states = new std::vector<uint8_t>(SIZE); 
    int statesSize = states->size() * sizeof(uint8_t); 

    if (verbose) std::cout << "Done\n"; 

    // Send data to device 
    if (verbose) std::cout << "Sending graph to device... "; 

    uint8_t * deviceStatesPointer; 
    cudaMalloc((void**)&deviceStatesPointer, statesSize); 
    cudaMemcpy(deviceStatesPointer, states, statesSize, cudaMemcpyHostToDevice); 

    if (verbose) std::cout << "Done\n"; 

    // Assign states 
    if (verbose) std::cout << "Assign states... "; 

    dim3 dimBlock(SIZE, 1); 
    dim3 dimGrid(1, 1); 
    assign_state<<<dimGrid, dimBlock>>>(deviceStatesPointer); 

    if (verbose) std::cout << "Done\n"; 

    // Get data back from device 
    if (verbose) std::cout << "Getting data back from device...\n"; 

    cudaMemcpy(states, deviceStatesPointer, statesSize, cudaMemcpyDeviceToHost); 

    if (verbose) 
    { 
     for (int i = 0; i < states->size(); i++) 
     { 
      std::cout << "\t" << i << ": " << states->at(i) << std::endl; 

     } 
    } 

    if (verbose) std::cout << "Done\n"; 

    return 0; 
} 

它的工作原理,只要我注释掉states[threadIdx.x] = 42'线,但如果我不这样做,该程序在打印出for循环的第一个迭代后立即崩溃。

从我在网上看到的,我猜我可能会试图写入内存我不应该写信给?

我一直在根据我的代码this Hello World example

+2

这个:'new std :: vector'是无稽之谈 – Drop

回答

1

当“复制”矢量的内容时,原因很可能是您的无效内存访问。

你是cudaMemcpy'从源地址states'。那不是的地址内容你的std::vector,它是你的std::vector的数据成员所在的地址。其中一个数据成员通常是指向heap area的指针 - 当您创建矢量或调整其大小时分配。您必须通过指针指向cudaMemcpy(例如states.cbegin()&states[0])。

请阅读如何使用标准的矢量类(例如on cppreference.com,虽然这是比教程更多的参考站点);你不需要new它 - 这只会给你一个std::vector在堆上,并且该new的结果不是数据将驻留的区域(你不分配自己)。