我正在尝试减少CUDA,我真的是一个新手.我目前正在研究NVIDIA的示例代码.
我想我真的不确定如何设置块大小和网格大小,特别是当我的输入数组大于(512 X 512)而不是单个块大小时.
这是代码.
template <unsigned int blockSize>
__global__ void reduce6(int *g_idata, int *g_odata, unsigned int n)
{
extern __shared__ int sdata[];
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x*(blockSize*2) + tid;
unsigned int gridSize = blockSize*2*gridDim.x;
sdata[tid] = 0;
while (i < n)
{
sdata[tid] += g_idata[i] + g_idata[i+blockSize];
i += gridSize;
}
__syncthreads();
if (blockSize >= 512) { if (tid < 256) { sdata[tid] += sdata[tid + 256]; } __syncthreads(); }
if (blockSize …Run Code Online (Sandbox Code Playgroud) 感谢您阅读我的帖子.
我的Cudafy无法加载cublas64_55.dll
我使用的是Windows 7,VS2012和CUDA5.5.我的cublas64_55.dll,cufft64_35.dll等都在
C:\Program Files\NVIDIA GPU ComputingTookit\CUDA\v5.5\bin
Run Code Online (Sandbox Code Playgroud)
我的环境变量CUDA_PATH和CUDA_PATH_5.5都是
C:\Program Files\NVIDIA GPU ComputingTookit\CUDA\v5.5
Run Code Online (Sandbox Code Playgroud)
我不明白为什么Cudafy找不到它.任何人有任何想法?非常感谢.
非常感谢您阅读我的主题.
我正在做CUDA工作,但继续得到cudaDeviceSynchronize()错误代码77:cudaErrorIllegalAddress,不知道为什么.我搜索了代码和函数,令人惊讶的是,只有少数记录显示出来.很奇怪.
我基本上总结了图像的所有像素.为了让我的问题尽可能多地参考,我在这里展示了我所有的CUDA代码:
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "thorcalgpu.h"
#include <stdio.h>
#include "math.h"
#include <vector>
#include <algorithm>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <numeric>
#include <iostream>
using namespace std;
float random_float(void)
{
return static_cast<float>(rand()) / RAND_MAX;
}
__global__ void reduceSum(unsigned short *input,
unsigned long long *per_block_results,
const int n)
{
extern __shared__ unsigned long long sdata[];
unsigned int i = blockIdx.x * blockDim.x + threadIdx.x;
// load input into __shared__ memory
unsigned short x = 0;
if(i < n) …Run Code Online (Sandbox Code Playgroud) 无论我如何重新安装CUDA驱动程序和工具包,在键入gpuDevice()时,它总是显示s:
CUDADevice with properties:
Name: 'Quadro K2000M'
Index: 1
ComputeCapability: '3.0'
SupportsDouble: 1
DriverVersion: 6.5000
ToolkitVersion: 5.5000
MaxThreadsPerBlock: 1024
MaxShmemPerBlock: 49152
MaxThreadBlockSize: [1024 1024 64]
MaxGridSize: [2.1475e+09 65535 65535]
SIMDWidth: 32
TotalMemory: 2.1475e+09
FreeMemory: 2.0431e+09
MultiprocessorCount: 2
ClockRateKHz: 745000
ComputeMode: 'Default'
GPUOverlapsTransfers: 1
KernelExecutionTimeout: 0
CanMapHostMemory: 1
DeviceSupported: 1
DeviceSelected: 1
Run Code Online (Sandbox Code Playgroud)
我不明白.为什么工具包版本总是5.5?我可以升级到6.5吗?
我有一个 .dat 文件,如下所示:
NUL NUL NUL ...
Run Code Online (Sandbox Code Playgroud)
所以这个 .dat 文件中的每个条目都是一个 16 位有符号整数。我想使用 C++ 一次读取两个字节。这是目前我阅读它的代码
short* ReadData(char* fileName, long imgWidth, long imgHeight, long bytePerPixel)
{
short * pData = new short[imgWidth*imgHeight*bytePerPixel];
short h1;
try
{
std::ifstream input(fileName, std::ios::binary);
while(!input.eof())
{
//Read file one byte at a time
input.read(&h1, sizeof(short));
}
return pData;
}
catch(int i)
{
return NULL;
}
delete pData;
}
Run Code Online (Sandbox Code Playgroud)
但它给了我错误,因为
input.read(&h1, sizeof(short));
Run Code Online (Sandbox Code Playgroud)
一次读取一个字节。我想一次读取 2 个字节。无论如何我可以做到这一点吗?或者读取其中有一堆 16 位有符号整数的 .dat 文件的最佳方法是什么?谢谢
感谢您阅读此主题。
基本上我想知道如何在脚本中使用指向 Visual Studio 2012 vcvarsall.bat 文件的相对路径/环境变量?
我目前使用绝对路径:
call "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\vcvarsall.bat" x86_amd64
Run Code Online (Sandbox Code Playgroud)
我怎样才能做这样的事情?
call "$(System)\$(Program Files)$(VS)\$(VC)\vcvarsall.bat" x86_amd64
Run Code Online (Sandbox Code Playgroud)
多谢。
编辑
如果我有多个 Visual Studio 版本怎么办?我的电脑上安装了vs2008和vs2012。
command-line batch-file relative-path environment-variables visual-studio
我想知道什么是使用malloc和free的正确/标准方式.是否需要在释放后设置指针NULL?基本上,以下两种方式中的哪一种是正确的?
double* myPtr = (double*)malloc(sizeof(double)*5);
.....
free(myPtr);
Run Code Online (Sandbox Code Playgroud)
要么
double* myPtr = (double*)malloc(sizeof(double)*5);
.....
free(myPtr);
myPtr = NULL;
Run Code Online (Sandbox Code Playgroud)
或者它应该是使用malloc和free的其他方法吗?谢谢.
这是一段代码,它给了我错误:
const char* name = pAttr->Name(); // attribute name
const char* value = pAttr->Value(); // attribute value
switch(name) // here is where error happens: must have integral or enum type
{
case 'SRAD': // distance from focal point to iso center
double D = atof(value);
break;
case 'DRAD': // distance from iso center to detector
break;
default:
break;
}
Run Code Online (Sandbox Code Playgroud)
这switch(name)是发生错误的地方.它说它是一个整体或枚举类型.那么我该怎么做一个char*类型的switch case或者等价?
这是代码,一个执行一些缓冲操作的函数:
void DoProfile (double* profile, double* &projection, int S, int H, double T)
{
double* p = projection;
for (int h = 0; h < H; h++)
{
memcpy(p, profile, sizeof(double)*S);
p += S;
}
// should p be deleted here like following?
// delete p;
// p = NULL;
}
Run Code Online (Sandbox Code Playgroud)
我不确定,但据我所知,只要不重点,那么最后不需要删除?有人请教育我.谢谢.
在C#中我有一个数据类型byte[],我想用返回的C++函数填写char*
C++函数(in ImageData.dll)
char* pMemoryBuffer = NULL;
char* LoadData(const char *fileName)
{
// processing pMemoryBuffer ...
return pMemoryBuffer;
}
Run Code Online (Sandbox Code Playgroud)
将本机dll导入C#:
[DllImport(".\\Modules_Native\\ImageData.dll", EntryPoint = "LoadData")]
private extern static byte[] LoadData(string fileName);
Run Code Online (Sandbox Code Playgroud)
byte[]C#中的数据
byte[] buffer = new byte[256*256];
buffer = LoadData("D:\\myPic.tif");
Run Code Online (Sandbox Code Playgroud)
显然它还没有工作,但它提出了我想做的想法.所以我想知道如何使这项工作,以及正确的方法是什么.非常感谢您的教育.
我想知道如何转换double*到float*,并float*以double*C或C++?谢谢.我尝试使用(float*)和使用(double*),但它似乎没有我的观察工作.