Почему атомная функция CUDA не работает?

Проблема в том, что я хочу подать заявку atomicMin в массив int. Мой массив состоит из 6 элементов и код:

#include <stdlib.h>
#include <stdio.h>

__global__ void kernel(int * globalmax, int * r){

    int val = r[threadIdx.x];
    *globalmax = atomicMin(globalmax, val);
}


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

    int m = 0;
    int * d_i;
    int r[] = {-3, 150, 11, -1, 15, -4};
    int * d_r;
    cudaMalloc((void **) &d_r, sizeof( int) * 6);
    cudaMalloc((void **) &d_i, sizeof(int));
    cudaMemcpy(d_r, r, sizeof( int) * 6, cudaMemcpyHostToDevice);
    cudaMemcpy(d_i, &m, sizeof(int) , cudaMemcpyHostToDevice);

    kernel<<<1, 7>>>(d_i, d_r);

    cudaMemcpy(&m, d_i, sizeof(int), cudaMemcpyDeviceToHost);
    printf("%d", m);
    cudaFree(d_i);
    cudaFree(d_r);
    return 0;
}

Когда я вызываю код ядра с 6 потоками, если минимальная позиция элемента равна 6, минимальный элемент не может быть возвращен, и если я вызываю ядро ​​с 7 потоками, я получаю правильный ответ. Что не так с этим кодом?

1 ответ

Решение

Вы не должны пытаться сохранить старое значение обратно в атомарную переменную. Изменить:

*globalmax = atomicMin(globalmax, val);

чтобы:

atomicMin(globalmax, val);
Другие вопросы по тегам