Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cuda 在gpu上的阵列上执行推力::min_元素_Cuda_Gpu_Thrust - Fatal编程技术网

Cuda 在gpu上的阵列上执行推力::min_元素

Cuda 在gpu上的阵列上执行推力::min_元素,cuda,gpu,thrust,Cuda,Gpu,Thrust,我试图找到一个数组的最小值,它位于gpu上。我可以在cpu上使用min_元素,但不确定如何在gpu上使用它。我也很困惑为什么minu元素的返回必须是一个数组,因为只有一个最小值?这是最接近我认为正确的,但我得到: “错误:对于最小元素行,不存在从“推力::设备ptr”到“双*”的适当转换功能。” 代码: #包括 #包括/*兰特()*/ #包含/*用于getpid()*/ #包括/*时间()*/ #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 使用名称空间std; bool

我试图找到一个数组的最小值,它位于gpu上。我可以在cpu上使用min_元素,但不确定如何在gpu上使用它。我也很困惑为什么minu元素的返回必须是一个数组,因为只有一个最小值?这是最接近我认为正确的,但我得到: “错误:对于最小元素行,不存在从“推力::设备ptr”到“双*”的适当转换功能。”

代码:

#包括
#包括/*兰特()*/
#包含/*用于getpid()*/
#包括/*时间()*/
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
bool errorAsk(const char*s=“不适用”)
{
cudaError_t err=cudaGetLastError();
if(err==cudaSuccess)
返回false;
printf(“CUDA错误[%s]:%s\n”,s,cudaGetErrorString(err));
返回true;
};
double*fillArray(double*c_idata,int N,double常量){
int n;
对于(n=0;ncout
推力::min_元素
返回迭代器

从:

min_元素查找范围[first,last]中的最小元素。它返回[first,last]中的第一个迭代器i,这样[first,last]中没有其他迭代器指向小于*i的值

迭代器类似于指针。它指示元素在容器中的位置。与指针类似,迭代器可以添加到或减去,等等

所以我们可以直接提取这个迭代器:

thrust::device_ptr<double> result_position = thrust::min_element(...
这是因为可以减去迭代器(或
推力::设备_ptr
)。从
min_元素
返回的迭代器减去容器的开头将给出最小元素位置的偏移量

下面是一个基于您的代码的工作示例:

$ cat t957.cu
#include <stdio.h>
#include <stdlib.h> /* for rand() */
#include <iostream>
#include <thrust/device_ptr.h>
#include <thrust/extrema.h>

using namespace std;

bool errorAsk(const char *s="n/a")
{
cudaError_t err=cudaGetLastError();
if(err==cudaSuccess)
    return false;
printf("CUDA error [%s]: %s\n",s,cudaGetErrorString(err));
return true;
};

double *fillArray(double *c_idata,int N,double constant) {
    int n;
    for (n = 0; n < N; n++) {
            c_idata[n] = constant*floor(drand48()*10.0);

    }
return c_idata;
}

int main(int argc,char *argv[])
{
    int N;
    N = 100;

    double *c_data,*g_data;
//    result = new double[N];

    c_data = new double[N];
    c_data = fillArray(c_data,N,1.0);
    c_data[32] = -1.0;
    cudaMalloc(&g_data,N*sizeof(double));
    cudaMemcpy(g_data,c_data,N*sizeof(double),cudaMemcpyHostToDevice);
    thrust::device_ptr<double> g_ptr =  thrust::device_pointer_cast(g_data);

    int result_offset = thrust::min_element(g_ptr, g_ptr + N) - g_ptr;

    double min_value = *(g_ptr + result_offset);
    // we could also do this:
    // double min_value = c_data[result_offset];
    std::cout<< "min value found at position: " << result_offset << " value: " << min_value << std::endl;
}
$ nvcc -o t957 t957.cu
$ ./t957
min value found at position: 32 value: -1
$
$cat t957.cu
#包括
#包括/*兰特()*/
#包括
#包括
#包括
使用名称空间std;
bool errorAsk(const char*s=“不适用”)
{
cudaError_t err=cudaGetLastError();
if(err==cudaSuccess)
返回false;
printf(“CUDA错误[%s]:%s\n”,s,cudaGetErrorString(err));
返回true;
};
double*fillArray(double*c_idata,int N,double常量){
int n;
对于(n=0;nstd::cout
推力::min_元素
返回迭代器

从:

min_元素查找范围[first,last]中的最小元素。它返回[first,last]中的第一个迭代器i,这样[first,last]中没有其他迭代器指向小于*i的值

迭代器类似于指针。它指示元素在容器中的位置。与指针类似,迭代器可以添加到或减去,等等

所以我们可以直接提取这个迭代器:

thrust::device_ptr<double> result_position = thrust::min_element(...
这是因为可以减去迭代器(或
推力::设备_ptr
)。从
min_元素
返回的迭代器减去容器的开头将给出最小元素位置的偏移量

下面是一个基于您的代码的工作示例:

$ cat t957.cu
#include <stdio.h>
#include <stdlib.h> /* for rand() */
#include <iostream>
#include <thrust/device_ptr.h>
#include <thrust/extrema.h>

using namespace std;

bool errorAsk(const char *s="n/a")
{
cudaError_t err=cudaGetLastError();
if(err==cudaSuccess)
    return false;
printf("CUDA error [%s]: %s\n",s,cudaGetErrorString(err));
return true;
};

double *fillArray(double *c_idata,int N,double constant) {
    int n;
    for (n = 0; n < N; n++) {
            c_idata[n] = constant*floor(drand48()*10.0);

    }
return c_idata;
}

int main(int argc,char *argv[])
{
    int N;
    N = 100;

    double *c_data,*g_data;
//    result = new double[N];

    c_data = new double[N];
    c_data = fillArray(c_data,N,1.0);
    c_data[32] = -1.0;
    cudaMalloc(&g_data,N*sizeof(double));
    cudaMemcpy(g_data,c_data,N*sizeof(double),cudaMemcpyHostToDevice);
    thrust::device_ptr<double> g_ptr =  thrust::device_pointer_cast(g_data);

    int result_offset = thrust::min_element(g_ptr, g_ptr + N) - g_ptr;

    double min_value = *(g_ptr + result_offset);
    // we could also do this:
    // double min_value = c_data[result_offset];
    std::cout<< "min value found at position: " << result_offset << " value: " << min_value << std::endl;
}
$ nvcc -o t957 t957.cu
$ ./t957
min value found at position: 32 value: -1
$
$cat t957.cu
#包括
#包括/*兰特()*/
#包括
#包括
#包括
使用名称空间std;
bool errorAsk(const char*s=“不适用”)
{
cudaError_t err=cudaGetLastError();
if(err==cudaSuccess)
返回false;
printf(“CUDA错误[%s]:%s\n”,s,cudaGetErrorString(err));
返回true;
};
double*fillArray(double*c_idata,int N,double常量){
int n;
对于(n=0;nstd::cout min_元素的返回值不是数组。它是一个前向迭代器,指向数组中保存min值的条目。min_元素的返回值不是数组。它是一个前向迭代器,指向数组中保存min值的条目