小编use*_*936的帖子

OpenCL:可以使用模板化对象作为Boost :: compute的内核参数吗?

我内核的函数签名如下:

template< size_t S, typename Field, typename Type1, typename Type2>
void kernel(const Type1 arg1, const Type2 arg2, Field *results) {
// S is known at compile time
// Field might be float or double
// Type1 is an object holding data and also methods
// Type2 is an object holding data and also methods

// The computation start here

}
Run Code Online (Sandbox Code Playgroud)

我知道可以使用c ++的一部分功能来编写内核,使用AMD对OpenCL实现的扩展,但结果代码仅限于在AMD卡上运行.

2.0之前版本的OpenCL语言标准规范限制程序员使用C99编写内核,我相信版本2.1和2.2还没有广泛用于Linux发行版.但是,我在这里发现Boost :: compute在某种程度上允许在内核规范中使用c ++特性的子集.但是,如果可以使用Boos :: compute在上面的代码片段中实现内核签名,则不清楚.在哪种程度上可以实现这样的内核?代码示例将非常感激.

c++ opencl boost-compute

6
推荐指数
1
解决办法
361
查看次数

正确管理大于GPU可用内存的结果数组?

定义了如何处理错误:

static void HandleError( cudaError_t err,
                         const char *file,
                         int line ) {
    if (err != cudaSuccess) {
        printf( "%s in %s at line %d\n", cudaGetErrorString( err ),
                file, line );
        exit( EXIT_FAILURE );
    }
}
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))
Run Code Online (Sandbox Code Playgroud)

通常,要将结果存储在类型为double的大小为N的数组d_results中,可以立即在GPU内存中分配,我们可以设法将数据从设备传输到主机,如下所示:

    double *d_results;
    HANDLE_ERROR(cudaMalloc(&d_results,N*sizeof(double)));
//Launch our kernel to do some computations and store the results in d_results
.....
// and transfer our data from the device to the host
vector<double> results(N);
cudaMemcpy(results.data(),d_results,N*sizeof(double),cudaMemcpyDeviceToHost);
Run Code Online (Sandbox Code Playgroud)

如果第二行失败,因为没有足够的内存来一次存储所有结果.如何设法进行计算并将结果正确传输到主机?是否必须按批次进行计算?我宁愿避免手动批处理.在CUDA中管理这种情况的标准方法是什么?

cuda gpgpu

5
推荐指数
1
解决办法
454
查看次数

在 MacOS 中使用 SYCL 1.2

我想开始使用SYCL,但目前发现需要安装ComputeCpp,而且只支持Ubuntu、CentOS和Windows。在 MacOS Catalina 上使用 SYCL 的替代方法有哪些?

macos sycl

4
推荐指数
1
解决办法
882
查看次数

标签 统计

boost-compute ×1

c++ ×1

cuda ×1

gpgpu ×1

macos ×1

opencl ×1

sycl ×1