Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 大量的0';使用cudaMemcpy()时收到的_Arrays_Parallel Processing_Cuda_Gpu - Fatal编程技术网

Arrays 大量的0';使用cudaMemcpy()时收到的

Arrays 大量的0';使用cudaMemcpy()时收到的,arrays,parallel-processing,cuda,gpu,Arrays,Parallel Processing,Cuda,Gpu,我刚刚开始学习CUDA,我想用随机数填充一个数组(表示为1D数组的2D数组)。为了生成随机数,我跟随了另一篇文章,但我不知道数字的生成是否有问题,也不知道从设备中恢复的内存是否有问题。问题是,尽管我试图用正在发送它的线程的id填充数组的任何单元格,以便在复制到主机内存后查看结果,但在使用cudaMemcpy()恢复数据后,我收到一个数组,该数组在任何位置都填充了0 我正在Visual Studio 2013上编程,使用cuda 7.5,使用i5 2500k作为处理器和960 GTX图形卡 这里是

我刚刚开始学习CUDA,我想用随机数填充一个数组(表示为1D数组的2D数组)。为了生成随机数,我跟随了另一篇文章,但我不知道数字的生成是否有问题,也不知道从设备中恢复的内存是否有问题。问题是,尽管我试图用正在发送它的线程的id填充数组的任何单元格,以便在复制到主机内存后查看结果,但在使用
cudaMemcpy()
恢复数据后,我收到一个数组,该数组在任何位置都填充了
0

我正在Visual Studio 2013上编程,使用cuda 7.5,使用i5 2500k作为处理器和960 GTX图形卡

这里是我尝试填充它的主要部分和方法。我也会更新cuRand初始化。如果你需要看别的东西,就告诉我

__global__ void setup_cuRand(curandState * state, unsigned long seed)
{
    int id = threadIdx.x;
    curand_init(seed, id, 0, &state[id]);
}

__global__ void poblar(int * adn, curandState * state){

    curandState localState = state[threadIdx.x];
    int random = curand(&localState);
    adn[threadIdx.x] = random;
    // It doesn't mind if i use the following instruction, the result is a lot of 0's
    //adn[threadIdx.x] = threadIdx.x;

}

int main()
{

    const int adnLength = NUMCROMOSOMAS * SIZECROMOSOMAS; // 256 * 128 (32.768)
    const size_t adnSize = adnLength * sizeof(int);
    int adnCPU[adnLength];
    int * adnDevice;

    cudaError_t error = cudaSetDevice(0);
    if (error != cudaSuccess) 
        exit(-EXIT_FAILURE);

    curandState * randState;
    error = cudaMalloc(&randState, adnLength * sizeof(curandState));
    if (error != cudaSuccess){
        cudaFree(randState);
        exit(-EXIT_FAILURE);
    }
    //Here is initialized cuRand
    setup_cuRand <<<1, adnLength >> > (randState, unsigned(time(NULL)));

    error = cudaMalloc((void **)&adnDevice, adnSize);

    if (error == cudaErrorMemoryAllocation){// cudaSuccess){
        cudaFree(adnDevice);
        cudaFree(randState);
        printf("\n error");
        exit(-EXIT_FAILURE);
    }


    poblar <<<1, adnLength >>> (adnDevice, randState);
    error = cudaMemcpy(adnCPU, adnDevice, adnSize, cudaMemcpyDeviceToHost);
    //After here, for any i, adnCPU[i] is 0 and i cannot figure what is wrong
    if (error == cudaSuccess){
        for (int i = 0; i < NUMCROMOSOMAS; i++){
            for (int j = 0; j < SIZECROMOSOMAS; j++){
                printf("%i,", adnCPU[(i*SIZECROMOSOMAS) + j]);
            }
            printf("\n");
        }
    }

    return 0;
} 
\uuuuu全局\uuuuuu无效设置\u cuRand(curandState*状态,未签名长种子)
{
int id=threadIdx.x;
curand_init(seed、id、0和state[id]);
}
__全局无效poblar(int*adn,curandState*state){
curandState localState=state[threadIdx.x];
int random=curand(&localState);
adn[threadIdx.x]=随机;
//我不介意使用下面的指令,结果是很多0
//adn[threadIdx.x]=threadIdx.x;
}
int main()
{
常量int adnLength=NUMCROMOSOMAS*SIZECROMOSOMAS;//256*128(32.768)
常数size\u t adnSize=adnLength*sizeof(int);
国际adnCPU[adnLength];
内部设备;
cudaError\u t error=cudaSetDevice(0);
如果(错误!=cudaSuccess)
退出(-exit_故障);
库兰州立大学*randState;
错误=cudamaloc(&randState,adnLength*sizeof(curandState));
如果(错误!=cudaSuccess){
库达弗里(兰德州立大学);
退出(-exit_故障);
}
//这是库兰德
设置存储(随机状态,未签名(时间(空));
错误=cudamaloc((void**)和adnDevice,adnSize);
if(error==cudaerrormoryallocation){//cudaSuccess){
库达弗里(adnDevice);
库达弗里(兰德州立大学);
printf(“\n错误”);
退出(-exit_故障);
}
波布拉尔(兰德斯塔州阿德副总统);
错误=cudaMemcpy(adnCPU、adnDevice、adnSize、cudaMemcpyDeviceToHost);
//在这里之后,对于任何i,adnCPU[i]都是0,我无法判断出哪里出了问题
如果(错误==cudaSuccess){
对于(int i=0;i

解决答案后编辑:给出的答案有一个特殊性,那就是你需要更少的线程数(该数量的一半对我有效)为了正确地使用cuRand对随机数进行种子设定。出于某种原因,我可以完美地创建线程,但无法为伪随机算法生成器进行种子设定。

硬件上每个块的最大线程数为1024,因此,如果adnLength大于1024,则可能无法使用adnLength安排调用

您遇到的错误很可能是一个调用配置错误,它是在任何GPU工作之前,在三角括号调用之后返回的。事实上,cudaMemcpy可能不会返回它,即使它从以前的异步调用返回错误


可能出现的错误是cudaErrorLaunchOutOfResources。

为了解决这个问题,我刚刚运行了256个线程并循环了128次,它真的很有效。非常感谢。我初始化cuRand的方式有什么问题吗?我获得的数字对于每个线程都是相同的。你应该设置一个种子方案,使每个线程发出不同的命令值。您对子序列的概念很感兴趣。深入研究curand文档,如果您仍然卡住,可能会发布另一个问题。问题是另一个问题。出于某种原因,我的
curand
只能使用最大线程数量的一半来运行(
1024
线程是我的最大值,所以
512
线程),因为当更多线程正在运行时,
cuRand
中的伪随机生成器仅使用0作为种子。此问题中的代码不完整,无法编译或运行。(现在已修改)您要问的问题只能通过查看
setup\u cuRand
的代码来明确回答。但请不要将此问题编辑到与已接受的答案不再相关的程度。如果您可以回答一个关于种子设定和初始化cuRand生成器的问题,请务必提问。但请在新问题中提问。这不是您的个人帮助线程,它是一个问答对,旨在对每个人都有用,而不仅仅是对您。@Talonmes如果我没有按照正确的方法解决我的错误,那就很抱歉了。我在代码中遇到了另一个小问题,并在有人使用代码之前通知了它。之后,我找到了解决方案并发布了。我将更改代码最后一次标题,因为前一次标题与我最终遇到的问题(我不知道那是什么)最相关。如果我的行为可能会损害社区的学习,我想向大家道歉。