小编Ono*_*Ono的帖子

减少CUDA

我正在尝试减少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)

algorithm cuda reduction cub

10
推荐指数
3
解决办法
2万
查看次数

Cudafy找不到cublas,cudafft

感谢您阅读我的帖子.

我的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 environment-variables visual-studio cublas cudafy.net

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

cudaDeviceSynchronize()错误代码77:cudaErrorIllegalAddress

非常感谢您阅读我的主题.

我正在做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)

c++ memory cuda gpu

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

gpuDevice()工具包版本总是5.5

无论我如何重新安装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吗?

matlab cuda gpu

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

一次读取两个字节的 .dat 文件

我有一个 .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 文件的最佳方法是什么?谢谢

c++ file-io

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

Visual Studio路径的环境变量?

感谢您阅读此主题。

基本上我想知道如何在脚本中使用指向 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

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

如何正确使用malloc和free memory?

我想知道什么是使用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的其他方法吗?谢谢.

c c++ memory malloc free

4
推荐指数
2
解决办法
2296
查看次数

在char*上切换案例

这是一段代码,它给了我错误:

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或者等价?

c++ string char switch-statement

3
推荐指数
2
解决办法
1万
查看次数

在这种情况下是否有任何内存泄漏?

这是代码,一个执行一些缓冲操作的函数:

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++ memory pointers

2
推荐指数
1
解决办法
74
查看次数

在C++中从char*获取C#中的byte []

在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)

显然它还没有工作,但它提出了我想做的想法.所以我想知道如何使这项工作,以及正确的方法是什么.非常感谢您的教育.

c# c++ dll marshalling

2
推荐指数
1
解决办法
4452
查看次数

将double*转换为float*

我想知道如何转换double*float*,并float*double*C或C++?谢谢.我尝试使用(float*)和使用(double*),但它似乎没有我的观察工作.

c c++ pointers

-1
推荐指数
1
解决办法
1166
查看次数