Cuda Visual Profiler неуказанная ошибка запуска - PullRequest
0 голосов
/ 16 ноября 2011

Поэтому, когда я запускаю свой код, он выполняется отлично, но когда я пытаюсь запустить его в Visual Profiler, он работает в первый раз, но кажется, что он хочет запустить программу семь раз, а во второй раз это приводит к неопределенномусбой запуска.Почему это случилось?Мой код выглядит так, как показано ниже, и моя проверка ошибок показывает, что ошибка происходит с cudaMemcpy (p-> siteset, rsites, sitesize, cudaMemcpyDeviceToHost);(Вероятно, проще всего найти в коде поиск по memcpy11, это будет строка выше)

Я не могу придумать причину, по которой программа, по сути, вызывает ошибку при втором запуске, но не при первоми если я запускаю его несколько раз в терминале, это совершенно нормально.Может кто-нибудь придумать, что может происходить?Спасибо!

void fillin(node *p, node *left, node *rt)
{
size_t stepsize = chars * sizeof(long);
size_t sitesize = chars * sizeof(sitearray);
seqptr lsites;
    cudaMalloc((void **) &lsteps, stepsize);

    checkCUDAError("malloc");
    cudaMalloc((void **) &lsites, sitesize);
    checkCUDAError("malloc");
    cudaMemcpy(lsteps, left->numsteps, stepsize, cudaMemcpyHostToDevice);
    checkCUDAError("memcpy7");
    cudaMemcpy(lsites, left->siteset, sitesize, cudaMemcpyHostToDevice);
    checkCUDAError("memcpy8");
    steptr rsteps;
    seqptr rsites;
    cudaMalloc((void **) &rsteps, stepsize);
    checkCUDAError("malloc");
    cudaMalloc((void **) &rsites, sitesize);
    checkCUDAError("malloc");
    cudaMemcpy(rsteps, rt->numsteps, stepsize, cudaMemcpyHostToDevice);
    checkCUDAError("memcpy9");
    cudaMemcpy(rsites, rt->siteset, sitesize, cudaMemcpyHostToDevice);
    checkCUDAError("memcpy");
    //call kernel
    int block_size = 1;
    int n_blocks = chars;
    fillinBoth <<<n_blocks, block_size>>> (lsteps, lsites, rsteps, rsites, chars);
    cudaMemcpy(p->numsteps, rsteps, stepsize, cudaMemcpyDeviceToHost);
    checkCUDAError("memcpy10");
    cudaMemcpy(p->siteset, rsites, sitesize, cudaMemcpyDeviceToHost);
    checkCUDAError("memcpy11");
    cudaFree(rsites); cudaFree(rsteps);
    cudaFree(lsites); cudaFree(lsteps);
    checkCUDAError("free");
}

}

__global__ void fillinBoth (steptr lsteps, seqptr lsite, steptr rsteps, seqptr rsite, long max){
boolean counted;
aas aa;
long s;
long i, j, k, n;
int idx = blockIdx.x;
//reduce array references; may or may not be useful
__shared__ long ls[3];
__shared__ long rs[3];
__shared__ long qs[3];
counted = false;
k = 0;
//computation from original program, but now need to do manual address calculation
if(idx < max){
    for(i = 0; i < 3; i++){
        rs[i]=rsite[idx][i];
        ls[i]=lsite[idx][i];
    }
    n = lsteps[idx] + rsteps[idx];
    counted = false;
    for (i = 0; i <= 5; i++) {
        if (k < 3) {
            switch (i) {

                case 0:
                    s = ls[0] & rs[0];
                    break;

                case 1:
                    s = (ls[0] & rs[1]) | (ls[1] & rs[0]);
                    break;

                case 2:
                    s = (ls[0] & rs[2]) | (ls[1] & rs[1]) | (ls[2] & rs[0]);
                    break;

                case 3:
                    s = ls[0] | (ls[1] & rs[2]) | (ls[2] & rs[1]) | rs[0];
                    break;

                case 4:
                    s = ls[1] | (ls[2] & rs[2]) | rs[1];
                    break;

                case 5:
                    s = ls[2] | rs[2];
                    break;
            }
            if (counted || s != 0) {
                qs[k] = s;
                k++;
                counted = true;
            } else if (!counted)
                n += cudaWeight[idx];
        }
    }
    for (i = 0; i <= 1; i++) {
        for (aa = ala; (long)aa <= (long)stop; aa = (aas)((long)aa + 1)) {
            if (((1L << ((long)aa)) & qs[i]) != 0) {
                for (j = i + 1; j <= 2; j++)
                    qs[j] |= cudaTranslate[(long)aa - (long)ala][j - i];
            }
        }
    }
    rsteps[idx] = n;
    for(i = 0; i < 3; i++)
        rsite[idx][i]=qs[i];
}

}

1 Ответ

1 голос
/ 13 февраля 2013

Попробуйте отключить все счетчики в настройках сеанса профиля. Также попробуйте удалить все файлы, такие как «temp_compute_profiler_1_1.csv», из вашей рабочей папки (см. Настройку профиля «Рабочая папка», по умолчанию она совпадает с местом вашего исполняемого файла).

Существует та же ошибка (OpenCL через CUDA): http://www.khronos.org/message_boards/viewtopic.php?t=4324

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...