poussée dans cuda noyau


2

J'ai cuda 8.0 installé sur ma machine (Linux SL7) aussi, j'ai téléchargé la poussée 1.8.1 et remplacer la bibliothèque de poussée existante avec le nouveau 1.8.1. Pour autant que je sache, à partir de la poussée 1.8, la poussée est supportée et peut être utilisée dans les noyaux. Je cite leur site web:

Thrust 1.8.0 introduces support for algorithm invocation from CUDA __device__ code, support for CUDA streams, and algorithm performance improvements. Users may now invoke Thrust algorithms from CUDA __device__ code

cependant, lorsque je construis l'application en utilisant l'éclipse Nsight, il me montre cette erreur:

calling a __host__ function("thrust::sort") from a __global__ function("mykernel") is not allowed.

S'il vous plaît tout conseiller?

voici mon code:

#include <iostream> 
#include <numeric> 
#include <stdlib.h> 
#include <stdio.h> 
#include <cuda_runtime.h> 
#include <cuda.h> 
#include <thrust/sort.h> 
#include <thrust/execution_policy.h> 

__global__ void mykernel(int* a, int* b) 
{ 

thrust::sort(a, a + 10); 
} 

int main(void) 
{ 
    int a[10] = { 0, 9, 7, 3, 1, 6, 4, 5, 2, 8 }; 
    int b[10]; 
    int *d_a, *d_c; 

    cudaMalloc((void**)&d_a, 10 * sizeof(int)); 
    cudaMalloc((void**)&d_c, 10 * sizeof(int)); 

    std::cout << "A\n"; 
    for (int i = 0; i < 10; ++i) { 
     std::cout << a[i] << " "; 
    } 

    cudaMemcpy(d_a, a, 10 * sizeof(int), cudaMemcpyHostToDevice); 
    mykernel<<<1, 1> > >(d_a, d_c); 
    cudaMemcpy(a, d_c, 10 * sizeof(int), cudaMemcpyDeviceToHost); 
    std::cout << "\nA\n"; 
    for (int i = 0; i < 10; ++i) { 
     std::cout << a[i] << " "; 
    } 

    cudaFree(d_a); 
    cudaFree(d_c); 
    return 0; 
} 
  0

Copie possible de [Pousser dans les noyaux écrits par l'utilisateur] (http://stackoverflow.com/questions/5510715/thrust-inside-user-written-kernels) 07 févr.. 172017-02-07 14:29:00

7

Vous avez raison. Thrust 1.8 et plus récent prennent en charge les appels d'algorithme dans le code de l'appareil. Toutefois, pour en tirer parti, vous devez utiliser le nouveau execution policies pour que la bibliothèque fonctionne correctement dans le code de l'appareil.

Si vous utilisez la version de sort qui comprend une politique d'exécution comme celui-ci:

__global__ void mykernel(int* a, int* b) 
{ 
    thrust::sort(thrust::device, a, a + 10); 
} 

vous devriez trouver le code compile correctement.

  0

Merci, ça marche bien maintenant. 06 févr.. 172017-02-06 20:41:41