几天前我开始在GPGPU上工作并成功实现了具有良好性能的胆甾醇分解,我参加了高性能计算会议,有人说"GPGPU是一个黑客".
我仍然感到困惑,这是什么意思,为什么他们说它是黑客.有人说这是黑客攻击,因为你正在将你的问题转换成矩阵并对其进行操作.但我仍然感到困惑,人们认为这是一个黑客,或者如果是,那么为什么呢?
任何人都可以帮助我,他们为什么称它为黑客,而我发现它没有任何问题.
我想写一个来自OpenCL内核的文件..比如C中的fwrite().
有没有这样的功能..或者我要做什么来写GPU的文件?
我主要有一个2D矩阵.我想从主机转移到设备.你能告诉我如何为它分配内存并将其传输到设备内存吗?
#define N 5
__global__ void kernel(int a[N][N]){
}
int main(void){
int a[N][N];
cudaMalloc(?);
cudaMemcpy(?);
kernel<<<N,N>>>(?);
}
Run Code Online (Sandbox Code Playgroud) OpenCL内存架构之间是否有任何直接关系:
本地/全局/常量/专用内存
而物理GPU的内存和缓存.例如,具有1GB内存/ L1缓存/ L2缓存的GPU卡.这些与本地/全球......记忆有关吗?
或者是从全局内存分配的本地/常量/专用内存?-谢谢
假设我有两个device_vector <byte>数组,d_keys并且d_data.
d_data例如,如果是扁平的2D 3x5阵列(例如{1,2,3,4,5,6,7,8,9,8,7,6,5,4,3})并且d_keys是1D阵列大小为5(例如{1,0,0,1,1}),我如何进行减少,这样如果相应的d_keys值为1 ,我最终只会按行添加值(例如,结束结果为{10,23,14})?
该sum_rows.cu例如允许我加入的每一个值d_data,但是这并不完全正确.
或者,我可以在每行的基础上使用a zip_iterator并一次合并d_keys一行d_data,然后执行a transform_reduce,仅在键值为1时添加,但是我必须循环遍历d_data数组.
我真正需要的是某种transform_reduce_by_key不是内置的功能,但肯定必须有一种方法来实现它!
我正在GPU上写一个图像恢复算法,细节在
QR分解法求解线性系统
Ax=b
Run Code Online (Sandbox Code Playgroud)
工作原理如下
min||Ax-b|| ---> ||QRx-b|| ---> ||(Q^T)QRx-(Q^T)b|| ---> ||Rx-(Q^T)b||
Run Code Online (Sandbox Code Playgroud)
R上三角矩阵在哪里.由此产生的上三角形线性系统易于求解.
我想使用CULA工具来实现此方法.CULA例程GEQRF计算QR分解.手册说:
在退出时,阵列对角线上方和上方的元素包含
min(M,N)-by-N上梯形矩阵R(R如果是上三角形m >= n);对角线下方的元素,与阵列一起TAU,表示Q作为min(m,n)基本反射器的乘积的正交/酉矩阵.
我无法弄清楚Q存储的位置,算法对我来说似乎太复杂了.你能提出什么建议吗?
谢谢!
我正在研究一个随机过程,我希望每次运行程序时,如果CUDA内核中的随机数生成不同的序列.这类似于我们在C++中通过声明seed = time(null)后跟srand(seed)和rand()
我可以通过内核将种子从主机传递到设备但是这样做的问题是我必须将每个线程的整个种子数组传递到内核中,以便每次都有不同的随机种子.有没有办法可以生成随机种子/进程if/machine time或类似内核之外的东西并将其作为种子传递?
我有Nvidia显卡(GeForce GT 640)ON MY MOTHERBOARD.我在我的盒子上安装了OpenCL.当我使用"clGetPlatformInfo(parameters)"查询平台时,我看到以下输出: -
#Available platforms: 1.
#1 CL_PLATFORM_NAME: NVIDIA CUDA
#1 CL_PLATFORM_PROFILE: FULL_PROFILE
#1 CL_PLATFORM_VERSION: OpenCL 1.1 CUDA 4.2.1
#1 CL_PLATFORM_VENDOR: NVIDIA Corporation
我应该从上面的输出推断出什么?据我了解,CUDA和OpenCL是两个不同的平台.输出表示总可用平台为:1,平台名称为CUDA,版本为OpenCL和CUDA.我完全糊涂了.
我目前正在使用英特尔的OpenCL SDK平台进行异构并行编程(OpenCL).我正在使用Visual Studio 2010 Ultimate.我的系统中没有任何GPU.我曾在CUDA SDK平台上进行opencl编程.这是我第一次使用英特尔的OpenCL SDK进行opencl编程.
我已经尝试了一些基本的平台,设备,上下文识别/创建/定义代码来自'OpenCL in Action'一书.他们一切都很好.因此我们可以认为visual studio已正确配置.
现在,我正在尝试在visual studio中构建一个"Hello World"程序,它给出了以下错误:
错误MSB3721:命令""C:\ Program Files(x86)\ Intel\OpenCL SDK\3.0\bin\x86\ioc32.exe"-cmd = build -input ="E:\ Menu\Google\programs\1code\feb\10feb2014\OpenCL\OpenCL\hello.cl"-output ="Debug\hello.out"-VS -device = CPU -simd = default -bo ="""退出,代码为-1073741511.C:\ Program Files(x86)\ MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\IntelOpenCL.targetS
现在我的问题是:
这个'错误MSB3721'有什么意义?
这是与编程相关的错误或"OpenCL + Visual Studio"配置有问题吗?
我想在这个问题中尽可能具体.如果我没有提供足够的信息并帮助我,请告诉我.我非常感谢你的关心.
我正在尝试为2D矩阵计算求和区域表,其中行和列的数量不相等.我遇到了一个小问题,我的代码似乎在行和列相等的情况下运行正常,但是当行和列不相等时,它无法计算最终输出的最后一行.问题是我无法弄清楚为什么会这样.
基本上,在积分和中,每个像素或索引元素计算其上方和后方的所有矩阵元素的总和.例如,对于具有以下元素的3x2输入数组:
[5, 2|
|5, 2|
|5, 2]
Run Code Online (Sandbox Code Playgroud)
输出数组中的积分和如下:
[5, 7|
|10, 14|
|15, 21]
Run Code Online (Sandbox Code Playgroud)
基本上以下是我在CUDA C中尝试做的事情:
for(int matrixElement_y_index=0; matrixElement_y_index<=total_rows-1; matrixElement_y_index++)
{
//matrixElement_x_index and matrixElement_y_index represent (x,y) indices of each matrix element
for(int matrixElement_x_index=0; matrixElement_x_index<=total_columns-1; matrixElement_x_index++)
{
int temp=0;
for(int r=0;r<=(matrixElement_y_index);r++)
{
for(int c=0; c<=matrixElement_x_index;c++)
{
temp=temp+input[c][r];
}
}
output[matrixElement_y_index][matrixElement_x_index]=temp;
}
}
Run Code Online (Sandbox Code Playgroud)
我到目前为止提出的CUDA C代码如下:
#include <iostream>
#include <cuda_runtime.h>
using namespace std;
__global__ void image_integral(int *a, int*b, int width_x,int width_y)
{
// Thread Ids equal to …Run Code Online (Sandbox Code Playgroud)