我是OpenCL编程的新手.设备,上下文和平台有什么区别?
我是第一次使用REST服务实现基本的客户端服务器体系结构.这次我将包含更多的类和服务与共享类对象作为客户端和服务器之间的参数进行了更复杂化.我在ApacheTomcat7上运行服务器.它正在成功执行.当我运行我的客户端它给我错误:javax.ws.rs.InternalServerErrorException: HTTP 500 Internal Server Error
我尝试调试我的代码,似乎我没有正确接收/发送响应.我知道在这里分享所有课程并不明智,但我别无选择,因为它浪费了我很多时间.任何帮助将不胜感激.提前致谢.
以下是我的ImageProgress课程.该类存在于服务器和客户端.
@XmlRootElement
public class ImageProgress{
private String name;
public ImageProgress( String image_name){
this.name = image_name;
}
public String getName() {
return name;
}
public void setName( String name ){
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
HPCResponse是一个类,其对象将作为服务器响应返回给客户端.HPCResponse基本上会返回ImageProgress对象,它会给我预期的结果.
@XmlRootElement
public class HPCResponse
{
private ImageProgress imgProgress;
public ImageProgress getImgProgress() {
return imgProgress;
}
public void setImgProgress(ImageProgress imgProgress) {
this.imgProgress = imgProgress;
}
}
Run Code Online (Sandbox Code Playgroud)
以下是来自名为HpcService的服务器的服务类,它将HPCResponse的对象作为响应返回.如您所见,startAnalysing方法接受HPCInfo的对象.HPCInfo的描述也在下面给出.
@Path( "/hpc" )
@Consumes( MediaType.APPLICATION_XML )
@Produces( MediaType.APPLICATION_XML )
public class …
Run Code Online (Sandbox Code Playgroud) 我使用CUDA 4.0 arch.,带有Compute_Capability 2.0设备(GTX460).'cubin'和'ptx'文件有什么区别?我认为cubin是gpu的本机代码,所以这是拱门.具体而言,ptx是一种通过JIT编译在Fermi设备(例如Geforce GTX 460)上运行的中间语言.当我编译cu源时,我可以在ptx或cubin目标之间进行选择.如果我想要cubin文件,我选择"code = sm_20".但如果我想要一个ptx文件,我会使用"code = compute_20".这是对的吗?
我正在尝试探索'__ldg内在'.我已经通过了NVIDIA的文档,但没有得到任何关于其使用和实现的满意答案.此外,参考这个我尝试在一个简单的1024*1024矩阵乘法示例中实现__ldg.
#include<stdio.h>
#include<stdlib.h>
__global__ void matrix_mul(float * ad,float * bd,float * cd,int N)
{
float pvalue=0;
//find Row and Column corresponding to a data element for each thread
int Row = blockIdx.y * blockDim.y + threadIdx.y;
int Col = blockIdx.x * blockDim.x + threadIdx.x;
//calculate dot product of Row of First Matrix and Column of Second Matrix
for(int i=0;i< N;++i)
{
// I tried with executing this first:
float m=__ldg(&ad[Row * N+i]);
float n=__ldg(&bd[i * N + Col]); …
Run Code Online (Sandbox Code Playgroud) 我在C中创建了以下结构"数据"
typedef struct data
{
double *dattr;
int d_id;
int bestCent;
}Data;
Run Code Online (Sandbox Code Playgroud)
'dattr'是上述结构中保持动态的数组.假设我必须创建10个以上结构的对象.即
dataNode = (Data *)malloc (sizeof(Data) * 10);
Run Code Online (Sandbox Code Playgroud)
对于这个结构的每个对象,我必须使用以下命令在C中为数组'dattr'重新分配内存:
for(i=0; i<10; i++)
dataNode[i].dattr = (double *)malloc(sizeof(double) * 3);
Run Code Online (Sandbox Code Playgroud)
如何在OpenCL中实现相同的功能?为结构对象分配内存后,如何为数组'dattr'分配内存?
为了记录这是家庭作业,所以尽量少帮助.我们使用常量存储器来存储"掩模矩阵",该掩模矩阵将用于在更大的矩阵上执行卷积.当我在主机代码中时,我使用cudaMemcpyToSymbol()将掩码复制到常量内存.
我的问题是,一旦将其复制并启动我的设备内核代码,设备如何知道访问常量内存掩码矩阵的位置.在内核启动时是否需要传入指针.教授给我们的大部分代码都不应该被改变(没有指向传入掩码的指针)但总是有可能他犯了一个错误(虽然这很可能是我对某些东西的理解)
是否应该将常量的memeory declaratoin包含在单独的kernel.cu文件中?
我正在最小化代码,只显示与常量内存有关的事情.因此,请不要指出是否有什么东西没有初始化等.有代码,但目前不关心.
main.cu:
#include <stdio.h>
#include "kernel.cu"
__constant__ float M_d[FILTER_SIZE * FILTER_SIZE];
int main(int argc, char* argv[])
{
Matrix M_h, N_h, P_h; // M: filter, N: input image, P: output image
/* Allocate host memory */
M_h = allocateMatrix(FILTER_SIZE, FILTER_SIZE);
N_h = allocateMatrix(imageHeight, imageWidth);
P_h = allocateMatrix(imageHeight, imageWidth);
/* Initialize filter and images */
initMatrix(M_h);
initMatrix(N_h);
cudaError_t cudda_ret = cudaMemcpyToSymbol(M_d, M_h.elements, M_h.height * M_h.width * sizeof(float), 0, cudaMemcpyHostToDevice);
//char* cudda_ret_pointer = cudaGetErrorString(cudda_ret);
if( cudda_ret != cudaSuccess){
printf("\n\ncudaMemcpyToSymbol …
Run Code Online (Sandbox Code Playgroud) 我正在做一个有关VoIP的项目,我的C代码中有pthreads。我需要启动pthread,并使它们在它们之间进行一些睡眠。现在我的线程正在运行,当我从服务器获得会话结束时,我需要停止正在运行的线程,并从头开始重新启动它们。
我的代码如下所示:
void *recv_thread(void *arg)
{
/*receive the multimedia data and close the recv_thread when there is no more data to receive*/
}
void *send_thread(void *arg)
{
/*send the multimedia data*/
}
send_recv_data()
{
pthread_create(thread2, NULL, send_thread, NULL);
pthread_create(thread3, NULL, recv_thread, NULL);
}
void *first_thread(void *arg)
{
/*if some condition met the start the routine for creation of two threads one for receiving and one for sending data*/
if(cond == TRUE){
send_recv_data();
}
}
main()
{
pthread_create(thread1, NULL, first_thread, NULL); …
Run Code Online (Sandbox Code Playgroud) 我目前正在使用英特尔的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"配置有问题吗?
我想在这个问题中尽可能具体.如果我没有提供足够的信息并帮助我,请告诉我.我非常感谢你的关心.
我是GPU计算领域的新手.所以我真的希望有人向我解释一下这些基础知识.我必须使用以下GPU的英特尔芯片组:
我感兴趣的是在GPU中运行具有大数据集的代数和按位函数,例如数组的转置或数组行的按位移位.目标当然是获得更多的表现.
我的主要问题是如何在GPU上编程?过去我曾使用CUDA在nVIDIA显卡上进行编程.我从之前的主题中了解到,我不能将CUDA用于INTEL GPU.提前致谢!!
更新1
我发现英特尔支持OpenCL用于高清显卡.更准确地说,适用于OpenCL应用程序的英特尔SDK为英特尔®平台上的OpenCL应用程序提供了全面的开发环境,包括兼容的驱动程序,代码示例,开发工具,如代码构建器,优化指南和对优化工具的支持.
SDK支持采用Intel®HDGraphics和Intel®Iris™图形系列的第3代和第4代Intel®Core™处理器上的OpenCL 1.2,采用Intel HD Graphics,Intel®Xeon®处理器和Intel®XeonPhi™的Intel®Atom™处理器协处理器.
这是我第一次在CUDA中实现结构.在下面的程序中,我将结构复制到GPU并对数据执行基本操作,并将结果复制回主机.
#include<stdio.h>
inline cudaError_t checkCuda(cudaError_t result)
{
#if defined(DEBUG) || defined(_DEBUG)
if (result != cudaSuccess) {
fprintf(stderr, "CUDA Runtime Error: %sn", cudaGetErrorString(result));
assert(result == cudaSuccess);
}
#endif
return result;
}
typedef struct myStruct {
int* a;
int b;
}MyStruct;
__global__ void structOperation(MyStruct *d_data){
int idx = threadIdx.x;
d_data->a[idx] += 10;
}
int main(){
MyStruct *h_data, *d_data, *out_data;
size_t structSize = sizeof(MyStruct);
size_t intSize = sizeof(int);
h_data = (MyStruct *) malloc(structSize * 1);
h_data->b = 32;
h_data->a = (int *)malloc(intSize * …
Run Code Online (Sandbox Code Playgroud) 每当我在CUDA中使用固定内存时,这个问题就会浮现在我的脑海中.我已经在这个主题上搜索了很多,但没有找到任何东西.基本上我们必须执行两次数据传输才能使用固定内存:
Step1 - >可分页内存到固定内存
步骤2 - >将内存固定到设备内存
我也可以通过输入数据直接初始化固定内存并将其传输到GPU,这样可以节省Step1的传输时间.在我的情况下,我在GPU上处理非常大量的输入数据.过多的页面锁定内存可能会降低整体系统性能.所以我不能只在固定内存上进行整个分配.我必须迭代地进行Step1和Step2(上面)的转移.
CUDA中是否有任何规定将您现有的主机内存(可分页)转换为固定内存?如下:
步骤1 - >按输入数据初始化可分页存储器
步骤2 - >将上述内存转换为固定内存
步骤3 - >转移到设备并执行执行
我希望我所要求的是有道理的.
I always thought that Hyper-Q technology is nothing but the streams in GPU. Later I found I was wrong(Am I?). So I was doing some reading about Hyper-Q and got confused more. I was going through one article and it had these two statements:
A. Hyper-Q is a flexible solution that allows separate connections from multiple CUDA streams, from multiple Message Passing Interface (MPI) processes, or even from multiple threads within a process
B. Hyper-Q通过允许32个同时进行的硬件管理的连接(与Fermi可用的单个连接相比),增加了主机与GK110 GPU之间的连接(工作队列)总数。
在前面提到的观点中,观点B指出主机可以创建多个连接到单个GPU。这是否意味着我可以通过不同的应用程序在一个简单的GPU上创建多个上下文?这是否意味着我必须在不同的流上执行所有应用程序?如果我的所有连接都占用内存并且计算资源消耗,谁来管理资源(内存/核心)调度,该怎么办?
我正在编写一个简单的多流 CUDA 应用程序。cuda-streams
以下是我创建,cublas-handle
和的代码部分cudnn-handle
:
cudaSetDevice(0);
int num_streams = 1;
cudaStream_t streams[num_streams];
cudnnHandle_t mCudnnHandle[num_streams];
cublasHandle_t mCublasHandle[num_streams];
for (int ii = 0; ii < num_streams; ii++) {
cudaStreamCreateWithFlags(&streams[ii], cudaStreamNonBlocking);
cublasCreate(&mCublasHandle[ii]);
cublasSetStream(mCublasHandle[ii], streams[ii]);
cudnnCreate(&mCudnnHandle[ii]);
cudnnSetStream(mCudnnHandle[ii], streams[ii]);
}
Run Code Online (Sandbox Code Playgroud)
现在,我的流计数为 1。但是当我使用 Nvidia Visual Profiler 分析上述应用程序的可执行文件时,我得到以下信息:
对于我创建的每个流,它会另外创建 4 个流。我用 进行了测试num_streams = 8
,它在分析器中显示了 40 个流。它在我心中提出了以下问题:
cudnn
创建流?如果是,那为什么?