Предполагаю, что вы хотите остановить запущенное ядро (не один поток).
Самый простой способ (и тот, который я предлагаю) - установить флаг глобальной памяти, который был протестирован ядро. Вы можете установить флаг с помощью 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
может быть намного больше (и может повлиять на производительность). Надеюсь, это помогло.
Подробнее здесь