Python ConfigParser: проверка существования опции

Предполагаю, что вы хотите остановить запущенное ядро ​​(не один поток).

Самый простой способ (и тот, который я предлагаю) - установить флаг глобальной памяти, который был протестирован ядро. Вы можете установить флаг с помощью cudaMemcpy () (или без использования единой памяти).

Как показано ниже:

if (gm_flag) {
  __threadfence();         // ensure store issued before trap
  asm("trap;");            // kill kernel with error
}

ams ("trap;") остановит все запущенные thread

Обратите внимание, что с cuda 2.0 вы можете использовать assert () для завершения ядра!

. Другой подход может быть следующим (у меня нет попробовал код!) [/ ​​g7]

__device__ bool go(int val){
    return true;
}

__global__ void stopme(bool* flag, int* val, int size){

    int idx= blockIdx.x *blockDim.x + threadIdx.x;
    if(idx < size){

        bool canContinue = true;
        while(canContinue && (flag[0])){
            printf("HELLO from %i\n",idx);
            if(!(*flag)){
                return;
            }
            else{
                //do some computation
                val[idx]++;
                val[idx]%=100;
            }
             canContinue = go(val[idx]);
        }
    }
}

#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, const char *file, int line, bool abort=true)
{
   if (code != cudaSuccess)
   {
      fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
      if (abort) exit(code);
   }
}

int main(void)
{
    int size = 128;
    int* h_val = (int*)malloc(sizeof(int)*size);
    bool * h_flag = new bool;
    *h_flag=true;

    bool* d_flag;
    cudaMalloc(&d_flag,sizeof(bool));
    cudaMemcpy(d_flag,h_flag,1,cudaMemcpyHostToDevice);

    int* d_val;
    cudaMalloc(&d_val,sizeof(int)*size );

    for(int i=0;i>>(d_flag,d_val,size);

    //--------------sleep for a while --------------------------

    *h_flag=false;
    cudaMemcpy(d_flag,h_flag,1,cudaMemcpyHostToDevice);

    cudaDeviceSynchronize();
    gpuErrchk( cudaPeekAtLastError() );

    printf("END\n");


} 

, где ядро ​​stopMe продолжает работать, пока кто-то со стороны хоста не установит флаг в false. Обратите внимание, что ваше ядро ​​может быть намного сложнее, чем это, и попытка синхронизировать все потоки для выполнения return может быть намного больше (и может повлиять на производительность). Надеюсь, это помогло.

Подробнее здесь

30
задан Jon Clements 17 July 2012 в 17:45
поделиться